這篇文章主要通過演示類在不同發展中的不通過定義方法,來向讀者表述它們之間的區別和聯系。
在C#1時代,我們喜歡這樣定義類:
public class Product { private string _name; public string Name { get { return _name; } } private decimal _price; public decimal Price { get { return _price; } } public Product(string name, decimal price) { this._name = name; this._price = price; } public static ArrayList GetArrayList() { ArrayList list = new ArrayList(); list.Add(new Product("WindowsPhone", 10m)); list.Add(new Product("Apple", 10m)); list.Add(new Product("Android", 10m)); return list; } public override string ToString() { return String.Format("{0}--{1}", _name, _price); } }
局限性:
1、ArrayList沒有提供與其內部內容有關的編譯時信息,如果不慎寫錯,編譯器也不會出現任何提示;
2、代碼中為屬性提供了公共的取值方法,這意味著如果添加對應的賦值方法,那麼賦值方法必須是共有的;
3、用於創建屬性和變量的代碼很復雜,這違背了我們進行封裝的原本意願;
在C#2時代,我們喜歡這樣定義類:
public class Product { private string _name; public string Name { get { return _name; } private set { _name = value; } } private decimal _price; public decimal Price { get { return _price; } private set { _price = value; } } public Product(string name, decimal price) { Name = name; Price = price; } public static List<Product> GetArrayList() { List<Product> list = new List<Product>(); list.Add(new Product("WindowsPhone", 10m)); list.Add(new Product("Apple", 10m)); list.Add(new Product("Android", 10m)); return list; } public override string ToString() { return String.Format("{0}--{1}", Name, Price); } }
現在,屬性擁有了私有的賦值方法,並且它能非常聰明的“猜出”List<Product>是告知編譯器列表中只能包含Product。試圖將一個不同類型添加到列表中會造成編譯時錯誤,並且當你從列表中獲取結果時,也並不需要轉化結果的類型;有效的解決了C#1中的前兩個問題;
在C#3時代,我們喜歡這樣定義類:
public class Product { public string Name { get; private set; } public decimal Price { get; private set; } public Product(){} public static List<Product> GetArrayList() { return new List<Product>() { new Product {Name = "WindowsPhone", Price = 10m}, new Product {Name = "Apple", Price = 10m}, new Product {Name = "Android", Price = 10m} }; } public override string ToString() { return String.Format("{0}--{1}", Name, Price); } }
發展到這個階段,我們可以很明顯的發現,不再有任何代碼(或者可見的變量)與屬性關聯,而且硬編碼的列表是以一種全然不同的方式構建,這樣一來,我們實際上是完全可以刪除就有的構造函數,但是外部代碼就不能再創建其他的產品實例。自動熟悉大大簡化了操作;
在C#4時代,我們喜歡這樣定義類:
public class Product { private readonly string _name; public string Name { get { return _name; } } private readonly decimal _price; public decimal Price { get { return _price; } } public Product(string name,decimal price) { this._name = name; this._price = price; } public static List<Product> GetArrayList() { return new List<Product>() { new Product(name: "WindowsPhone", price: 10m), new Product(name: "Apple", price: 10m), new Product(name: "Android", price: 10m) }; } public override string ToString() { return String.Format("{0}--{1}", Name, Price); } }
在這個特定的示例中,C#4的特性的好處還不是很明顯,但當方法或構造函數包含多個參數時,它可以是代碼的含義更加清-特別是當參數類型相同,或某個參數為null時。當然,你可以選擇什麼時候使用該特性,只在是代碼更好的理解時才指定參數的名稱;
總結:
C#1(只讀屬性,弱類型集合)------》C#2(私有屬性賦值方法,強類型集合)------》C#3(自動實現的熟悉,增強的集合和對象初始化)------》C#4(用命名實參更清晰的調用構造函數和方法)
注:由於C#5在這方面的特性表現的沒有太大變化,所以就不再表述。
如果你覺得這篇文章對你有所幫助,歡迎轉載,但請注明出處!