[譯]C# 7系列,Part 3: Default Literals

原文: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%兼容。

 

系列文章:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章