語法糖這東西,懂的人就看得很舒服,不懂的人就看不懂。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) { }
不用解釋應該也知道這段判斷式在講什麼吧,可讀性非常的高!
後記
每一種做法都相當簡單,稍微讀過一次就會了,只是沒有看過了話,還是滿容易就卡住,不知道這段程式碼到底是在做啥。
這就是語法糖的威力!
參考資料: