- 原文連結: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,甚至還有一個更短的語法。還引入了丟棄。它們是未使用且被忽略的變量,在代碼中用下劃線(_)。結合空合併運算符(??),可以這樣編寫空檢查:
_ = 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) { }
總結
So, with C# 9.0, you can write your null / not-nulll checks like below, and I think that’s readable: 因此,使用 c# 9.0,您可以編寫 null/not-null 檢查,如下所示,我認為這是可讀的:
if (name is null) { }
if (name is not null) { }
祝您編程愉快!