前言
前不久,微軟宣布從 C# 11 中移除參數空值檢查功能,該功能允許在方法開始執行之前,在參數名稱的末尾提供參數空值檢查(!!
操作符)。
那么,在 C# 中如何檢查參數是否為 null 呢?
1. == null
這個可能是大家第一個就會想到的方法。
使用相等運算符符檢查兩個操作符是否相等:
if(user?==?null)throw?new?ArgumentNullException(nameof(user));
但是,==
運算符可以被重載,可能導致檢查空值的結果和預想的不一致:
public?class?User
{...public?static?bool?operator?==(User?user1,?User?user2){return?false;}
}var?user?=?null;
if(user?==?null)?//?falsethrow?new?ArgumentNullException(nameof(user));
這時,可以使用is
運算符。
2. is null
is
運算符檢查表達式的結果是否與給定的類型相匹配。將表達式與 null 匹配時,編譯器保證不會調用用戶重載的==
運算符:
public?class?User
{...public?static?bool?operator?==(User?user1,?User?user2){return?false;}
}var?user?=?null;
if(user?is?null)?//?truethrow?new?ArgumentNullException(nameof(user));
3. 模式匹配
“模式匹配”是一種測試表達式是否具有特定特征的方法。模式匹配最常見的方案之一是確保值不是 null:
int??maybe?=?12;if?(maybe?is?int?number)
{Console.WriteLine($"The?nullable?int?'maybe'?has?the?value?{number}");
}
else
{Console.WriteLine("The?nullable?int?'maybe'?doesn't?hold?a?value");
}
但是,對于檢查空值功能來說,這種方式可讀性較差。
4. ArgumentNullException.ThrowIfNull
如果你使用的是 C# 10,建議你使用ArgumentNullException.ThrowIfNull
方法檢查空值:
ArgumentNullException.ThrowIfNull(user);
使用該方法的好處之一是在異常消息中會自動包含參數名稱。
方法詳細介紹可參看《.NET 6新特性試用 | ArgumentNullException衛語句》
結論
你是否還知道其他檢查空值的方法,歡迎留言討論。
添加微信號【MyIO666】,邀你加入技術交流群