C#: 不同的方式檢查Null

- 原文鏈接:https://www.thomasclaudiushuber.com/2020/03/12/c-different-ways-to-check-for-null/
- 原文作者:Thomas
- 翻譯:沙漠盡頭的狼
檢查參數(shù)值是否為空的經(jīng)典方法是什么?如果您已經(jīng)使用C語言開發(fā)了一段時(shí)間,您可能會(huì)熟悉以下經(jīng)典語法:
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關(guān)鍵字進(jìn)行null檢查,如下面的代碼段所示:
if?(name?is?null)
{
??throw?new?ArgumentNullException(nameof(name));
}
但是對(duì)于C# 7,甚至還有一個(gè)更短的語法。還引入了丟棄。它們是未使用且被忽略的變量,在代碼中用下劃線(_)。結(jié)合空合并運(yùn)算符(??),可以這樣編寫空檢查:
_?=?name????throw?new?ArgumentNullException(nameof(name));
也就是說,整個(gè)方法看起來就像這樣:
public?static?int?CountNumberOfSInName(string?name)
{
??_?=?name????throw?new?ArgumentNullException(nameof(name));
??return?name.Count(c?=>?char.ToLower(c).Equals('s'));
}
老實(shí)說,我真的很喜歡使用丟棄的最后一種方法,但是對(duì)于一些開發(fā)人員來說,這可能太多了。我認(rèn)為is關(guān)鍵字非常清晰易讀。它是我的最愛。
is關(guān)鍵字還有一個(gè)很大的優(yōu)點(diǎn),就是它忽略了任何==/!=運(yùn)算符或者重載特定類。不管是否有操作符重載,它都將執(zhí)行null檢查。這比僅僅使用==更好。你可以在這篇博文[1]中了解更多。
C# 9.0中的Is關(guān)鍵字和Not模式
在C# 9.0中,如果您想檢查對(duì)象不為null,那么將is表達(dá)式與邏輯not模式結(jié)合起來這是非常強(qiáng)大的。在C# 9.0之前,您必須使用如下的is表達(dá)式來檢查對(duì)象是否為null:
if?(!(name?is?null))?{?}
一些開發(fā)人員傾向于使用以下語法來檢查name不為null:
if?(name?is?object)?{?}
但是上面的陳述既不可讀也不容易理解。這就是為什么許多開發(fā)人員仍然喜歡經(jīng)典的方式:
if?(name?!=?null)?{?}
但從C# 9.0開始,您可以編寫如下的非空檢查,我認(rèn)為這是真正可讀的代碼:
if?(name?is?not?null)?{?}
總結(jié)
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檢查,如下所示,我認(rèn)為這是可讀的:
if?(name?is?null)?{?}
if?(name?is?not?null)?{?}
祝您編程愉快!
參考資料
[1]這篇博文: https://www.thomasclaudiushuber.com/2020/03/19/c-why-you-should-prefer-the-is-keyword-over-the-operator/
