[ 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