学渣的c#复习手记 类 二 字段与属性

学渣又开始逗比了

今天说一下。。。字段和属性

字段什么的。。没什么太大意思

还是先展示一段代码

  class property
    {
        public property()
        {
            //对readonly字段进行赋值。。
            Console.WriteLine("这里是构造函数,对只读字段赋值为20");
            power_readonly1 = 20;
        }
        private const int power_const = 100;
        //对于一个常量来说必须有一个值。。而且必须在声明它的时候就有
        private readonly int power_readonly1;
        //这个东西有只读属性,这个东西比const灵活,只能被赋值一次。。在构造函数里
        //字段估计就说这么多了
        //属性
        int _power;
        public int power
        {
            get
            {
                return _power+1;
            }
            //这里是属性值

            set
            {
                //c#参考书上是这么屌丝地写着:do whatever needs to be done set the property
                //n翻译过来就是。。做任何需要或者想做的事情。。也就是说我们可以把这里当做一个方法
                Console.WriteLine("执行_power = value之前 
 value
 _power
 power");
                Console.WriteLine(value);
                Console.WriteLine(_power);
                Console.WriteLine(power);
                _power = value;//value这个东西就是给power赋的值, value 是隐式参数,此参数的类型是属性的类型。
                Console.WriteLine("执行_power = value之后");
                Console.WriteLine(value);
                Console.WriteLine(_power);
                Console.WriteLine(power);
                Console.WriteLine("属性在此执行");
            }
        }
        //这里就有的说了,上面这个属性是自己写的,在这个地方需要自己定义一个变量,然后一起使用,不然会出乱子。
        public int power_moren
        {
            get;
            set;
        }
        //其实在这里还是定义了一个int型的变量,默认生成的(一会我会搞一个图)
        private int _power_readonly;
        public int power_readonly
        {
            get 
            {
                return _power_readonly;
            }
        }
        //这是一个只读属性。。c#高级编程77页代码貌似有问题。。
        //同样光有set是只写的,但是不推荐使用。。为什么。。只写属性的意义是什么?
        //最后照理写一个测试方法
        public void assignment()
        {
            Console.WriteLine("给默认赋值为20");
            power_moren = 20;
            Console.WriteLine("给那个所谓的只读属性(所谓只读只是对外部只读。。封装。。)赋值为300");
            _power_readonly = 300;
            Console.WriteLine("给那个写的过程最多的赋值400");
            power = 400;
        }
        public void showTime()
        {
            Console.WriteLine("power_const");
            Console.WriteLine(power_const);
            Console.WriteLine("power_readonly1");
            Console.WriteLine(power_readonly1);
            Console.WriteLine("power");
            Console.WriteLine(power);
            Console.WriteLine("power_moren");
            Console.WriteLine(power_moren);
            Console.WriteLine("power_readonly");
            Console.WriteLine(power_readonly);
        }
    }

然后还是main函数

        static void Main(string[] args)
        {
            property wangji = new property();
            wangji.assignment();
            wangji.showTime();
            Console.ReadKey();
        }

输出了预期的结果

刚才说到有一个属性是默认生成的。。现在在反编译器里看一下。。这样可以更加好的了解原理

属性必定对应了一个变量。。

好吧。。现在想一下给属性赋值的时候发生了什么事情

首先一个属性被赋值的时候。

比如上面的power=400;

属性内部会有一个叫做value的值被赋值。。

这个时候执行set(你问get什么时候执行。。我认为当需要属性的值出现的时候才会执行)

然后输出刚才的那些东西,如上面的预期结果

后来对_power=value赋值完毕后

在读取power的值的时候开始执行。。然后就如刚才的所示。。数字发生了改变

///////////////////////////////////////////////////////////////////////////

最后说一下属性的意义

我认为get访问器的意义在于处理数据。并且输出处理完的数据。输入的数据,一般情况下在set里都会有将后备变量改为value值

然后这个时候属性的值就是power在get访问器里进行处理。(比如说可以写收钱水表的处理代码)

所以power=400并不代表power==400

。。

set访问器里我们可以利用value(传入的数值)和属性值来做自己想做的事情,在属性被赋值时执行。。

其实到底来说

属性还是一种简化,简化了对传入数据的处理过程,属性值不是一个真实存在变量形式,而是计算出来的,与备用变量有密切关系。

睡觉去了。。

原文地址:https://www.cnblogs.com/zuoguangxing/p/3538138.html