• C#属性与字段


    C#属性与字段

    国庆难得放松了一周,九月真的很大压力。代价是回到学校之后一直还债,加上红会那边全体大会、R社的百团招新,学业和自学没什么进展,但是也挤时间学了很多东西。这周相对没那么忙了,受狒狒哥的启发我也更新一下博客吧。(说那么多,只是想说我没有摸鱼)

    字段

    字段(field)是一种表示与对象或类型(类与结构体)关联的变量。前面很多修饰的词,最后的名词是变量,所以说字段就是变量。字段是类型的成员(这就是它与一般变量的不同之处),旧称“成员变量”,与对象关联的字段也被称为“实例字段”,与类型关联的字段成为“静态字段”,由static修饰。静态字段指的是只初始化一次,只有一份,生命周期直到程序退出。
    字段没有显式初始化时,字段获得其类型的默认值,所以字段不会存在未被初始化的情况。实例字段在对象创建的时候初始化,静态字段在类型被加载(load)的时候被初始化。
    还有一类字段叫只读字段,由readonly修饰,字面意思就是只能读取不能修改。它与const常量的区别在于:const常量在声明的时候就要初始化,而readonly可以先声明,再后续初始化。但是被它们修饰的变量,一旦被初始化就不能修改它们的值。
    为了方便,介绍完属性之后再给出代码。

    属性

    属性(property)是一种用于访问对象或类型特征的成员,特征反映了状态。我们使用属性:对外可以暴露数据,数据可以是保存在字段里面的,也可以是动态计算出来的;对内可以保护字段,不被非法值污染。属性由getset方法进化而来。
    一般情况下,建议使用属性而不是字段来暴露数据,字段都设为private,这也很好体现了封装的思想。
    下面是一段代码示范:

    using System;
    
    namespace SomeNote
    {
        class Program
        {
            static void Main(string[] args)
            {
                Boy boy = new Boy(17, 1.85, 68);
                Boy.Girlfriend = 1;                                     //修改静态字段的值
    
                Console.WriteLine(boy.Height);
                Console.WriteLine(boy.Age);
                Console.WriteLine(boy.Weight);
                Console.WriteLine(boy.Sex);
                Console.WriteLine(Boy.Girlfriend);
    
                boy.Weight = 70;                                        //修改属性的值
                boy.Height = 1.86;
    
                Console.WriteLine(boy.Height);
                Console.WriteLine(boy.Age);
                Console.WriteLine(boy.Weight);
                Console.WriteLine(boy.Sex);
            }
        }
    
        class Boy
        {
            private double weight;                                      //建议字段都是private的
            private int age;
            public readonly string Sex = "Man";                         //只读字段
            public static int Girlfriend = 0;
     
            public double Weight                                        //完整声明的属性
            {
                get { return weight; }
                set { weight = value; }
            }
    
            public double Height { get; set; }                          //简略声明,一个语法糖,vs偷偷帮你声明了一个private的字段
    
            public int Age { get { return age; } }                      //只读属性,没有setter
    
            //构造函数
            public Boy(int age, double height, double weight)
            {
                this.age = age;
                this.weight = weight;
                this.Height = height;
            }
        }
    }
    

    其实字段都不用多解释了,一目了然。
    weightage都是private的,在boy这个实例里面看不到:
    私有成员
    Sex是只读字段,不能修改它的值:
    只读字段
    Girlfriend是静态字段,初始化之后就一直存在,直到程序退出。
    Weight是一个属性,它的值来自weight,可以通过属性来修改字段的值(有setter)。
    Height也是一个属性,但是你一定想问,它和哪个字段挂钩了?其实这是个”语法糖“,可以通过反编译看到它的原理。
    Age是一个只读属性,它只有getter,没有setter,这就决定了它只读的性质,我们是不能修改它的值的:
    只读属性
    最后的结果:
    结果
    至于判断成员变量、实例变量,我相信不用我解释了,一看就懂。

    一些牢骚

    说实话未来两个月都没什么时间,最近专心去攻C++,还得准备R社的会员课,压力真的大。本来目标是这个寒假去面试实习岗的,但是感觉自己的水平完全不够,而且师兄们也劝我不要盲目实习,现在还是定为暑假实习吧。C#接下来就要讲委托、事件这些的,想想都觉得麻烦,最怕越写越乱、内容塞太多,还是有空再静下心来总结吧。(翻译:摸了

  • 相关阅读:
    浅谈服务端渲染
    vuex数据持久化
    vuex中的命名空间
    如果在项目中使用阿里图标库
    vue中的插槽
    webpack相关以及搭建react环境
    数组的reduce方法
    再也不用等后端的接口就可以调试了Json-server
    react中如何使用swiper
    解决vue中组件库vant等ui组件库的移动端适配问题
  • 原文地址:https://www.cnblogs.com/Jay-Auditore/p/13849885.html
Copyright © 2020-2023  润新知