原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/html
C#的default關鍵字有兩種用法:一種是標記switch…case結構的默認分支(會匹配任意不被全部case條件匹配的路徑);另外一種方法是表示類型的「默認」值。我將在本文中討論這個用法。異步
一個類型的默認值:async
下面的截圖是一個簡單的例子。函數
可是,你不能對任何開放類型使用默認表達式(注意:開放類型是具備未綁定類型參數的類型;一個擁有全部的綁定類型參數的類型被稱爲封閉類型),例如:spa
如今,若是咱們想在一個方法中使用泛型類型的默認值,咱們必須寫相似這樣的代碼:code
public static void Method(ImmutableArray<int> array) { } public static void Main(string[] args) { Method(default(ImmutableArray<int>)); }
你看到上面代碼的冗餘了嗎?編譯器應該知道Method()所需的第一個參數的確切類型。因此一個不須要具體類型的關鍵字default應該足夠了。htm
默認文本表達式blog
C# 7.1容許default表達式。若是使用C#語言版本7.1或更新版本進行編譯,您能夠將代碼簡化以下:內存
public static void Method(ImmutableArray<int> array) { } public static void Main(string[] args) { Method(default); }
如今你的代碼簡潔了!get
相似地,你能夠在default(…)表達式能夠出現的全部地方使用默認文本表達式:
public static void Main(string[] args = default) { // 可選參數的默認值 int i = default; // 類型 System.Int32 的默認值 0 string s = default; // 類型 System.String 的默認值 null Method(default); // 使用參數的默認值調用一個方法 T t = default; // 類型參數的默認值 return default; // 一個有返回值的方法返回默認值 }
你還可以在判斷條件中使用默認文本表達式
int x = 2; if (x == default) { } // 判斷x是不是類型 System.Int32 的默認值 0 if (x is default) { } // 同上
更有趣的是,您能夠在switch…case語句中使用默認文本表達式。哦,太酷了!等一下,要是我輸入"case default"標籤呢?下面這張圖是我在VS中輸入case default的截圖:
若是你使用VS的建議來修改你的語句,就會變成下面這樣:
int x = 2; switch (x) { case (default): break; //譯註:VS建議使用case 0 或者 case null來代替。 default: break; }
這看起來很讓人困惑,但至少咱們獲得了關於這個的實時分析,感謝Roslyn!(譯註:C#編譯器)
我想說的最後一件事是,有些狀況下不能應用默認文本表達式,例如:
// 錯誤: 'as' 必須用在引用類型 default as int; // OK. 可是左邊的表達式老是null。 if (default as string == string.Empty) { } // 錯誤,不能對default關鍵字使用操做符is。 if (default is string) { }
結論
C# 7.1中的默認文本表達式避免了編譯器知道默認值時的冗餘輸入。這是語法上的改進,CLR沒有任何變化,新代碼與C#編譯器早期版本構建的代碼100%兼容。
系列文章:
(本文)