#region 常量和静态变量静态类readonly

#region 常量和静态变量静态类readonly
        //----------------------------------------------------------------------
        //常量和静态变量,静态类
        //----------------------------------------------------------------------
        //类的静态变量和常量,都属于类而不属于对象,不能用对象来调用,只能用类名调用
        //这不同于C++,是更合理的设计
        //常量的值在类定义时就确定了,不因对象而不同,因此存放在类中更合理
        class CNormclass
        {
            class CInclass
            {
                public float fx = 20;
            }
            public int _id;
            public const string cname = "CNormalclass";

            //1,常量仅能修饰 :数字,bool,字符串,null引用
            //不能像C++那样定义一个常量对象,这真是太悲哀了,因为很多时候这可以加速数据传递,增加安全//由于这个原因,C#的List.ToArray每次都只能返回一个内部数组的拷贝,因此使用list存储数量较大较复杂的数据//不要轻易使用ToArray,直接用List就行了,它也支持下标索引方式取数组元素
            const CInclass lst = null;

            //2,readonly也不能实现常量对象的效果
            //readonly仅表示变量本身不能被赋值,但不阻止通过对象变量更改对象内的字段
            //onc.readonlyobj.fx = 20
            public float fx = 20;

            private readonly CInclass readonlyobj = new CInclass();
  
            public static void Test()
            {
                //1,不能调用非静态字段或方法
                //this._id = 20; //error,没有this指针

                //2,可以调用常量字段
                var lname = cname;

                var onc = new CNormclass();

                //私有变量在类的静态方法也可以访问
                //2,虽然不能更改readonlyobj本身的值,却可以更改其内部成员的值,这就是readonly的作用
                onc.readonlyobj.fx = 20; 
            }
        }
        static class C712//类中类,默认为私有
        {//静态类不能实例化,且只能声明:常量,静态常量,静态属性,静态方法
            public const int constX = 20; //1,常量
            public static int staticX = 0; //2,静态常量
            public static int ix { set; get; } //3,静态属性

            //一,【静态类中不能定义实例化字段】
            //public int _id; 

            //二,【静态类中不能定义实例化字段】
            //void Ctest(){ //【error: 静态类中不能定义实例化方法】
            //    this._id = 20;
            //}

            static void Test()//4,静态方法
            {
                //三,【静态方法中不能调用非静态变量或方法,因为没有this指针】
                //_id = 20;  //error 

                //四,【可以调用常量字段,这与C++不同】
                var c = constX;
            }

        }
        public const int ixd = 20;
        public static float fx = 20;
        public void Testff()
        {
            fx = 30; //等价于Program.fx = 30,而不是 this.fx = 30;
            Program.fx = 30;
            var tx = C712.constX;
            C712.staticX = 30;
            var ix = Program.ixd;

            //var oc7 = new C712(); //error 静态类不能创建实例
        }

 

posted @ 2018-07-30 16:52  时空观察者9号  阅读(240)  评论(0编辑  收藏  举报