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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM