一、c#版本中添加的功能: C#2.0 泛型 部分類型 匿名方法 迭代器 可空類型 Getter / setter單獨可訪問性 方法組轉換(代表) Co- and Contra-variance for delegates 靜態類 Delegate inference 泛型 部分類型 匿名方法 迭代 ...
一、c#版本中添加的功能:
C#2.0
-
泛型
-
部分類型
-
匿名方法
-
迭代器
-
可空類型
-
Getter / setter單獨可訪問性
-
方法組轉換(代表)
-
Co- and Contra-variance for delegates
-
靜態類
-
Delegate inference
C#3.0
-
隱式類型局部變數
-
對象和收集初始化器
-
自動實現的屬性
-
匿名類型
-
擴展方法
-
查詢表達式
-
Lambda表達式
-
表達樹
-
部分方法
C#4.0
-
動態綁定
-
命名和可選參數
-
Generic co- and contravariance
-
嵌入式互操作類型(“NoPIA”)
C#5.0
-
非同步方法
-
Caller info attributes
C#6.0
-
Compiler-as-a-service(Roslyn)
-
將靜態類型成員導入命名空間
-
異常過濾器
-
在Catch和Finally中使用Await
-
自動屬性初始化器
-
只讀屬性的預設值
-
Expression-bodied members
-
Null-conditional operators(空條件運算符,簡潔檢查)
-
字元串插值
- nameof operator
-
字典初始化器
C#7.0
-
out變數
-
模式匹配
-
元組
-
解構
-
局部函數
-
數字分隔符
-
二進位文字
-
局部引用和引用返回
-
擴展非同步返回類型
-
表達式的構造函數和finalizers
- Expression bodied getters and setters
-
throw表達式
C#7.1
- Async main
-
預設表達式
1.C#1.1代碼
1 using System.Collections; 2 using System.ComponentModel; 3 4 namespace Chapter01.CSharp1 5 { 6 [Description("Listing 1.01")] 7 public class Product 8 { 9 string name; 10 public string Name 11 { 12 get { return name; } 13 } 14 15 decimal price; 16 public decimal Price 17 { 18 get { return price; } 19 } 20 21 public Product(string name, decimal price) 22 { 23 this.name = name; 24 this.price = price; 25 } 26 27 public static ArrayList GetSampleProducts() 28 { 29 ArrayList list = new ArrayList(); 30 list.Add(new Product("West Side Story", 9.99m)); 31 list.Add(new Product("Assassins", 14.99m)); 32 list.Add(new Product("Frogs", 13.99m)); 33 list.Add(new Product("Sweeney Todd", 10.99m)); 34 return list; 35 } 36 37 public override string ToString() 38 { 39 return string.Format("{0}: {1}", name, price); 40 } 41 } 42 }View Code
代碼局限:
1>.ArrayList沒有提供與其內部內容相關的編譯時信息,可以添加任何類型數據。
2>.代碼中為屬性設置了公共的get方法,則意味著要添加對應的set方法也是公共的。
3>.用於創建屬性和變數的代碼過於複雜,包括一個私有變數和一個公共方法。
2.C#2.0代碼
1 using System.Collections.Generic; 2 using System.ComponentModel; 3 4 namespace Chapter01.CSharp2 5 { 6 [Description("Listing 1.02")] 7 public class Product 8 { 9 string name; 10 public string Name 11 { 12 get { return name; } 13 private set { name = value; } 14 } 15 16 decimal price; 17 public decimal Price 18 { 19 get { return price; } 20 private set { price = value; } 21 } 22 23 public Product(string name, decimal price) 24 { 25 Name = name; 26 Price = price; 27 } 28 29 public static List<Product> GetSampleProducts() 30 { 31 List<Product> list = new List<Product>(); 32 list.Add(new Product("West Side Story", 9.99m)); 33 list.Add(new Product("Assassins", 14.99m)); 34 list.Add(new Product("Frogs", 13.99m)); 35 list.Add(new Product("Sweeney Todd", 10.99m)); 36 return list; 37 } 38 39 public override string ToString() 40 { 41 return string.Format("{0}: {1}", name, price); 42 } 43 } 44 }View Code
private set{name=value;}
屬性可以有公共的get訪問器和私有的或者是受保護的set訪問器,這有助於控制屬性的設置方式。
List<T>強類型集合,可以告知編譯器列表中只能包含制定的泛型,試圖將一個不同的類型添加到列表中,會造成編譯時錯誤。
3.C#3.0代碼
1 using System.Collections.Generic; 2 using System.ComponentModel; 3 4 namespace Chapter01.CSharp3 5 { 6 [Description("Listing 1.3")] 7 class Product 8 { 9 public string Name { get; private set; } 10 public decimal Price { get; private set; } 11 12 public Product(string name, decimal price) 13 { 14 Name = name; 15 Price = price; 16 } 17 18 Product() 19 { 20 } 21 22 public static List<Product> GetSampleProducts() 23 { 24 return new List<Product> 25 { 26 new Product { Name="West Side Story", Price = 9.99m }, 27 new Product { Name="Assassins", Price=14.99m }, 28 new Product { Name="Frogs", Price=13.99m }, 29 new Product { Name="Sweeney Todd", Price=10.99m} 30 }; 31 } 32 33 public override string ToString() 34 { 35 return string.Format("{0}: {1}", Name, Price); 36 } 37 } 38 }View Code
自動實現的屬性和簡化的初始化大大的簡化了代碼。(Lambda表達式特性操作同樣簡捷)
硬編碼列表不同的構建方式,由於沒有name和price變數可供訪問,我們必須在類中處處使用屬性,這增強了一致性。
4.C#4.0代碼
1 using System.Collections.Generic; 2 using System.ComponentModel; 3 4 namespace Chapter01.CSharp4 5 { 6 [Description("Listing 1.04 (and more)")] 7 public class Product 8 { 9 readonly string name; 10 public string Name { get { return name; } } 11 12 decimal? price; 13 public decimal? Price { get { return price; } } 14 15 public Product(string name, decimal? price = null) 16 { 17 this.name = name; 18 this.price = price; 19 } 20 21 public static List<Product> GetSampleProducts() 22 { 23 List<Product> list = new List<Product>(); 24 list.Add(new Product(name: "West Side Story", price: 9.99m)); 25 list.Add(new Product(name: "Assassins", price: 14.99m)); 26 list.Add(new Product(name: "Frogs", price: 13.99m)); 27 list.Add(new Product(name: "Sweeney Todd", price: 10.99m)); 28 list.Add(new Product(name: "Unpriced")); 29 return list; 30 } 31 32 public override string ToString() 33 { 34 return string.Format("{0}: {1}", name, price); 35 } 36 } 37 }View Code
1>.構造函數包含多個參數時,全部使用命名參數,將不再需要記住或查找形參在所調用方法的形參列表中的順序。
new Product(price: 9.99m,name: "West Side Story")位置相反也可以構造成功。
2>命名實參與位置實參混合時,要麼命名實參位於所有位置實參後面,要麼部分位置實參要處於正確的形參列表中位置。
概念:命名實參和可選實參。 通過命名實參,你可以為特定形參指定實參,方法是將實參與該形參的名稱關聯,而不是與形參在形參列表中的位置關聯。 通過可選參數,你可以為某些形參省略實參
註意:命名實參、位置實參、可選實參的區別。
總結:
→C#1,只讀屬性弱類型集合
→C#2,私有屬性賦值方法強類型集合
→C#3,自動實現的屬性,增強的集合和對象初始化
→C#4,用命名實參更清晰地調用構造函數和方法。