• 学渣的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(传入的数值)和属性值来做自己想做的事情,在属性被赋值时执行。。

    其实到底来说

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

    睡觉去了。。

  • 相关阅读:
    Excel怎样设置标题行,Excel工作表中标题行的处理
    Delphi的WebBrowser改造,对网页中Alter等对话框的改造方法
    Delphi实现的MIME邮件格式解析类库
    学习C#中调用COM,后期绑定(以及对WinHttp COM对象的C#封装)
    Unicode in RAD Studio
    Delphi2010中字符串汇编需要注意的一点,以及支持2010的AES加密库
    一个SQL Server中的FormatDatetime函数
    关于图像合成所引申的几个函数
    TstringBuilder Delphi2007版
    SQL Server下字符串,整数转换成16进制字符串的方法
  • 原文地址:https://www.cnblogs.com/zuoguangxing/p/3538138.html
Copyright © 2020-2023  润新知