改善 C# 的語言習慣(一) - 使用屬性而不是可訪問的數據成員
序
為什么我們的程序運行得棒棒的,還要改呢?Why?
答:我們要讓程序運行得更快,執行的效率更高,代碼的可讀性更強,維護的成本更低... ...。
目錄
- 屬性介紹
- 屬性的另一種形式 - 索引器介紹
- 小結
屬性
屬性是 C# 中的一等公民。我們可以為 setter 和 getter 指定不同的訪問權限,屬性允許將數據成員作為公共接口的一部分暴露出去,與此同時,也能夠進行一定的封裝。
屬性的使用跟數據成員的使用一樣,但底層依然是通過方法來實現的。
我們在訪問屬性的時候,實際上調用的是方法的接口,所以可以享受到方法調用的所有好處。
其實,通過 VS 我們可以直接鍵入 prop + 兩次 TAB 鍵,就可以快速完成屬性的編寫。

圖1 隱式屬性
一般來說,我們直接使用 C# 3 的隱式屬性語法即可,並且不需要給 getter 和 setter 加上其它驗證邏輯。
屬性可以擁有方法的所有語言特性,如:使用 virtual,abstract 等關鍵字。

圖2
我們也可以使用訪問修飾符對 getter 和 setter 制定不同的訪問權限,這樣就可以更精妙的控制數據成員的可見性。
public int Id { get; protected set; }
我們可以通過 IL 代碼對比下隱式屬性語法所生成的代碼和過去寫法生成的代碼有什么不同。
public class Person { public int Id { get; set; } private string _name; public string GetName() { return _name; } public void SetName(string name) { _name = name; } }

圖3
從上圖可知,隱式屬性在 IL 也會生成類似 _name 的字段 <Id>k__BackingField(雖然名字有點奇葩),同時也會生成 getXX 和 setXX 方法。
索引器介紹
索引器又稱含參屬性(parameterized property)。this 是索引器的關鍵字。
【注意】所有的索引器都必須使用 this 關鍵字來進行聲明,不能指定其他名稱。即,對於同樣的參數列表,只能,只允許有一個索引器。
當然,索引器也可以使用 virtual(虛),abstract(抽象)關鍵字。
同時,索引器的參數可以是一維數組,也可以是多維數組。
public class Person { public int Id { get; set; } public string Name { get; set; } public string this[int index] { get { return Name; } set { Name = value; } } public int this[string name] { get { return Id; } set { Id = value; } } public string this[int x, int y] { get { return Name; } set { Name = value; } } }
【原文】http://www.cnblogs.com/liqingwen/p/6294290.html
【博主】反骨仔
