原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/ C#的default關鍵字有兩種用法:一種是標記switch…case結構的預設分支(會匹配任意不被所有case條件匹配 ...
原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/
C#的default關鍵字有兩種用法:一種是標記switch…case結構的預設分支(會匹配任意不被所有case條件匹配的路徑);另一種方法是表示類型的“預設”值。我將在本文中討論這個用法。
一個類型的預設值:
- 如果類型是引用類型,則為空
- 如果類型是值類型,則使用這個值類型的無參數構造函數構造出來的實例。
下麵的截圖是一個簡單的例子。
但是,你不能對任何開放類型使用預設表達式(註意:開放類型是具有未綁定類型參數的類型;一個擁有所有的綁定類型參數的類型被稱為封閉類型),例如:
現在,如果我們想在一個方法中使用泛型類型的預設值,我們必須寫類似這樣的代碼:
public static void Method(ImmutableArray<int> array) { } public static void Main(string[] args) { Method(default(ImmutableArray<int>)); }
你看到上面代碼的冗餘了嗎?編譯器應該知道Method()所需的第一個參數的確切類型。所以一個不需要具體類型的關鍵字default應該足夠了。
預設文本表達式
C# 7.1允許default表達式。如果使用C#語言版本7.1或更新版本進行編譯,您可以將代碼簡化如下:
public static void Method(ImmutableArray<int> array) { } public static void Main(string[] args) { Method(default); }
現在你的代碼簡潔了!
類似地,你可以在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%相容。
系列文章: