- 原文連結:https://www.thomasclaudiushuber.com/2020/03/12/c-different-ways-to-check-for-null/
- 原文作者:Thomas
- 翻譯:沙漠盡頭的狼
檢查參數值是否為空的經典方法是什麼?如果您已經使用 C 語言開發了一段時間,您可能會熟悉以下經典語法:
public static int CountNumberOfSInName(string name)
{
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}
return name.Count(c => char.ToLower(c).Equals('s'));
}
自 C# 7 開始,您可以使用 is 關鍵字進行 null 檢查,如下面的程式碼片段所示:
if (name is null)
{
throw new ArgumentNullException(nameof(name));
}
但是對於 C# 7,甚至還有一個更短的語法。還引入了丟棄(discard)。它們是未使用且被忽略的變數,在程式碼中用底線(_)表示。結合 null 合併運算子(??),可以這樣編寫空檢查:
_ = name ?? throw new ArgumentNullException(nameof(name));
也就是說,整個方法看起來就像這樣:
public static int CountNumberOfSInName(string name)
{
_ = name ?? throw new ArgumentNullException(nameof(name));
return name.Count(c => char.ToLower(c).Equals('s'));
}
老實說,我真的很喜歡使用丟棄的最後一種方法,但是對於一些開發人員來說,這可能太多了。我認為 is 關鍵字非常清晰易讀。它是我的最愛。
is 關鍵字還有一個很大的優點,就是它忽略了任何 == / != 運算子或會覆載特定類別。不管是否有運算子覆載,它都將執行 null 檢查。這比僅僅使用 == 更好。你可以在這篇部落格文章中了解更多。
C# 9.0 中的 Is 關鍵字與 Not 模式
在 C# 9.0 中,如果您想檢查物件不為 null,那麼將 is 運算式與邏輯 not 模式結合起來是非常強大的。在 C# 9.0 之前,您必須使用如下的 is 運算式來檢查物件是否為 null:
if (!(name is null)) { }
一些開發人員傾向於使用以下語法來檢查 name 不為 null:
if (name is object) { }
但是上面的陳述既不可讀也不容易理解。這就是為什麼許多開發人員仍然喜歡經典的方式:
if (name != null) { }
但從 C# 9.0 開始,您可以編寫如下的非空檢查,我認為這是真正可讀的程式碼:
if (name is not null) { }
總結
因此,使用 C# 9.0,您可以編寫 null / not-null 檢查,如下所示,我認為這是可讀的:
if (name is null) { }
if (name is not null) { }
祝您程式愉快!