C# 自动属性

[ C# 3.0/.Net 3.x 新增特性 ]

1.1 以前的做法:先写私有变量,再写公有属性

    public class Student
    {
        private Int32 _id;

        public Int32 Id
        {
            get { return _id; }
            set { _id = value; }
        }
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        private Int16 _age;

        public Int16 Age
        {
            get { return _age; }
            set { _age = value; }
        }
    }

1.2 现在的做法:声明空属性

    public class Person
    {
        public Int32 ID { get; set; }
        public string Name { get; set; }
        public Int16 Age { get; set; }
    }

 

 

PS:现在看来,是不是少些很多代码?直接声明一个空属性,编译器就可以帮我们完成以前的私有成员字段和get、set方法,于是,我们可以通过Reflector反编译工具去看看,到底是怎么完成这个操作的。

1.3 伟大的“乡村基”—CSC(C Sharp Compiler):C#编译器

  (1)首先我们来编译一下上面这个小程序,然后将编译后的exe/dll拖到反编译神器Reflector(或者ILSpy也是赞赞哒)

  (2)找到Person类,可以看到编译后的结果:CSC帮我们自动生成了与共有属性对应的私有字段

  我们可以从图中看出,自动生成的字段与以前的字段有一些区别:

  ①在每个字段上方都加上了一个[CompilerGenerated]的特性(Attribute),顾名思义:表示其是由编译器生成的;

  ②每个字段的变量名称是有一定格式的,比如<Age>k__BackingField,那么可以看出格式为:<属性名>k_BackingField;(BackingField顾名思义就是背后的字段)

  (3)看完了自动生成的字段,再来看看属性是怎么定义的:

  ①和自动生成的字段一样,属性也加上了[CompilerGenerated]的特性以示区别

  ②众所周知,属性就是一个get和一个set的两个方法的封装,那么我们之前写的空get/set方法又是怎么被编译生成的呢

 

  于是,我们可以看到,在get和set方法中,也加上了[CompilerGenerated]的特性以示区别,另外还帮我们自动对应了自动生成的私有字段,这就跟我们自己手动写的私有字段+共有属性的方法保持了一致。所以,自动属性是一个实用的语法糖,帮我们做了两件事:自动生成私有字段,自动在get/set方法中匹配私有字段。

 

出处:http://edisonchou.cnblogs.com

posted @ 2020-05-29 11:21  delafqm  阅读(2401)  评论(0编辑  收藏  举报