語法糖這東西,懂的人就看得很舒服,不懂的人就看不懂。C# 9 有另一種檢查物件是否為 Null 的方式,很簡單,看過一次之後遇到就不會看不懂了。

過去我們檢查是否為 Null 最常用的方式大改長得像下面這樣:

if (name == null)
{
    throw new ArgumentNullException(nameof(name));
}

到了 C# 7 的時候,推出了 is 運算子,讓我們可以用可讀性更高的方式來檢查 Null,如下:

if (name is null)
{
    throw new ArgumentNullException(nameof(name));
}

同時,C# 7 來另外推出了 _ 捨棄?? 聯合運算子,這讓上面的程式碼可以變得更簡潔,如下:

_ = name ?? throw new ArgumentNullException(nameof(name));

在 C# 7 就可以有這麼多種變化可以使用了,在 C# 8 的時候對模式比對(Pattern Matching)的特性有了大幅度的增強,讓我們可以用這樣的方式來檢查某物件是否不是 Null:

if (name is object) { }

這個寫法還有另一種比較天書的寫法,長這樣:

if (name is {}) { }

這兩個運作的原理是 C# 7 的 is 有了模式比對的能力之後,進而在 C# 8 的 is 運算子擴充了此能力,增加了屬性比對(Property Pattern)能力,因此可以用來判斷某物件是否包含於 {} (相當於 object 物件),除了 Null 之外的物件都是會被包含於 {} 的,所以也就代表該物件不是 Null,這個判斷式得以成立。

此外,這樣的寫法還可以在後面加上別名,將原本的變數名稱改成另一個名稱,如下面的 alias 就是 name 的別名:

if (name is {} alias) { }

到了 C# 9 的時候,對於 is 運算子又進行了特性上的擴充,讓我們可以使用 is not 這個 邏輯模式(Logical Patterns)來判斷某物件是否不是 Null,來看看下面的寫法:

if (name is not null) { }

不用解釋應該也知道這段判斷式在講什麼吧,可讀性非常的高!

後記

每一種做法都相當簡單,稍微讀過一次就會了,只是沒有看過了話,還是滿容易就卡住,不知道這段程式碼到底是在做啥。

這就是語法糖的威力!


參考資料:


Poy Chang

Trial and Error