在 10 分鐘或更短時間內 C# 10 和 .NET 6 中的 Null 參數檢查
[[academy-video-youtube({"vid": "230zlnKkl3A", "start_time": "0", "title": "Null Parameter Checks in C# 10 and .NET 6 In 10 Minutes or Less", "creator": "Tim Corey", "length": "4m 49s"})]]
在使用C#時,開發人員常常會遇到將空參數傳遞進方法的情況。 如果處理不當,這可能會導致意料之外的行為、運行時錯誤,甚至未處理的異常。 在他的影片"不到10分鐘學會C# 10與.NET 6中的空參數檢查"中,Tim Corey解釋了C# 10如何透過ArgumentNullException類來簡化空值的處理。
在這篇文章中,我們將按照Tim的解釋逐步講解該影片,以了解空檢查是如何運作的,以及它們在現代C#中的改進。
準備階段 – 檢查空參數
Tim開始建立一個簡單的.NET 6控制台應用來展示在C#中如何處理空參數檢查。 他清除模板程式碼並宣告了一個可空的字串變數:
string? info = null;string? info = null;此空物件表示一個場景,即方法呼叫可能接收到未正確實例化的參數。 然後Tim定義了一個簡單的方法:
void SayHi(string message)
{
Console.WriteLine($"您好 {message}");
}void SayHi(string message)
{
Console.WriteLine($"您好 {message}");
}他將info變數傳遞給該方法:
SayHi(info);SayHi(info);當程式執行時,輸出只是顯示:
您好未發生異常,因為字串連接接受空值並將其視為空字串。 但正如Tim指出的,在大多數真實場景中,這可能導致錯誤多發情況,在調用堆棧中後端出現問題或稍後出現NullReferenceException。
為了編寫健壯的程式碼,開發人員應驗證參數並確保任何方法預期會接收到有效的非空輸入。
C# 10之前的傳統空檢查
Tim解釋道,在C# 10之前,好的做法是手動檢查參數並在需要時拋出ArgumentNullException。 在SayHi方法中,他新增了:
if (message is null)
throw new ArgumentNullException(nameof(message));if (message is null)
throw new ArgumentNullException(nameof(message));此檢查確保如果傳遞了空參數,程式將立即拋出ArgumentNullException類的一個新實例。
當Tim運行程式碼時,錯誤資訊清楚顯示:
System.ArgumentNullException: Value cannot be null. (Parameter 'message')System.ArgumentNullException: Value cannot be null. (Parameter 'message')此未處理的異常表示方法接收了無效參數。 參數名——在本例中為'message'——自動顯示在輸出中,幫助開發人員精確識別是哪些參數引起了問題。
Tim指出,這種手動檢查在.NET Framework和早期的.NET Core版本中運行良好。 然而,在處理多個參數時,這很冗長且重複。 需要驗證的每個附加參數都要增加三到四行程式碼,使方法體變得冗雜。
C# 10中的簡化方法 – ArgumentNullException.ThrowIfNull()
在這時,Tim介紹了現代的C# 10語法。 現在開發人員可以用單行空檢查來替代為每個參數編寫多行程式碼:
ArgumentNullException.ThrowIfNull(message);ArgumentNullException.ThrowIfNull(message);Tim解釋說,這個單行程式碼在內部執行相同的驗證邏輯。 如果傳遞的參數為空,該方法會自動拋出異常——就像以前一樣——但語法更加清晰。
當程式再次執行時,出現以下輸出:
System.ArgumentNullException: Value cannot be null. (Parameter 'message')System.ArgumentNullException: Value cannot be null. (Parameter 'message')行為保持不變,但現在語法更簡化。 不再需要手動建立ArgumentNullException物件或手動指定paramName參數。 呼叫者的參數名由編譯器自動推斷。
Tim強調,這種改進節省了時間,並減少了因引用錯誤的參數名而引發人為錯誤的機會。
範例:多個參數
然後Tim比較傳統方法和處理多個參數時的新方法。
在C# 10之前,開發人員可能會編寫:
if (name is null)
throw new ArgumentNullException(nameof(name));
if (email is null)
throw new ArgumentNullException(nameof(email));
if (password is null)
throw new ArgumentNullException(nameof(password));if (name is null)
throw new ArgumentNullException(nameof(name));
if (email is null)
throw new ArgumentNullException(nameof(email));
if (password is null)
throw new ArgumentNullException(nameof(password));有了C# 10的增強,同樣的檢查現在可以更簡潔地書寫:
ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);這種改進不僅僅是關於減少行數——它使您的方法更清晰、可讀性更高,且更易於維護。 Tim指出,如果您的方法需要三個參數,您現在只需三行空檢查,而不是十二行程式碼。
為什麼這很重要 – 更安全、更健壯的程式碼
Tim指出,雖然手動將空值傳遞給字串的操作在演示中可能不現實,但它代表著真實世界中的問題。 API、使用者輸入、反序列化過程,或者由物件返回的任務可能會出乎意料地產生空物件。
通過在方法開始處新增空檢查,您可以防止意外行為並實現快速失敗——即程式在問題傳播之前,在調用堆棧的早期拋出一個異常。
他還提到,這種新語法幫助您在各個方法中保持一致的錯誤處理模式。 這鼓勵編寫對無效輸入和未實例化物件有韌性的健壯程式碼。
ArgumentNullException詳情
Tim指出,ArgumentNullException是System命名空間的一部分並繼承自ArgumentException類。 當將空引用傳遞給不接受它作為有效參數的方法時,就會拋出它。
它通常包括:
引發問題的參數名。
明確的錯誤資訊:"值不能為空"。
- 說明異常發生位置的調用堆棧。
Tim的範例展示了.NET 6如何繼續遵循這種行為,同時改進了語法。
他還簡要提到,開發人員可以將這些檢查與其他功能結合起來,例如空合并運算符(??)或預設值,以提供後備邏輯——例如:
message ??= "Default message";message ??= "Default message";這允許方法分配一個預設值而不是拋出,如果需要的話。
空檢查在錯誤處理中的重要性
Tim提醒開發人員,即使C#現在支持可空引用型別,運行時空檢查仍然是必要的。 編譯器無法捕捉每個空引用問題——尤其當資料來自外部來源或您無法控制的方法時。
他強調最好的做法是檢查您的參數並在適當時拋出ArgumentNullException,確保只有在輸入有效時才執行該方法。 這最小化了運行時錯誤,簡化了錯誤處理,並防止了靜默失敗。
總結與展望
如Tim所述,C# 11將引入更多改進,但目前,ArgumentNullException.ThrowIfNull()是.NET 6中錯誤處理和程式碼安全性手的最佳小功能改進之一。
他鼓勵開發人員在自己項目中嘗試這種方法,看看方法更清晰的程度。 他以一個問題結束:"您對C# 10的這一變化有什麼想法?"
最後的想法
Tim Corey的影片清楚地表明了ArgumentNullException.ThrowIfNull()方法是C# 10中的一項簡單但強大的改進。它減少了易於出錯的手動程式碼,確保了有效的參數,並在傳遞空參數時快速失敗程式。
透過一致地使用此方法,開發人員可以構建出強健、可讀性強且易於維護的程式碼,黑格利地處理異常並避免隱蔽的空引用錯誤。
簡言之,無論何時您的方法需要有效參數並且您想防止空參數,請遵循Tim Corey的範例,並使用:
ArgumentNullException.ThrowIfNull(parameterName);ArgumentNullException.ThrowIfNull(parameterName);這是一種更清晰、更安全並且更現代的方法,能保護您的程式碼免受空值和運行時錯誤影響,在.NET 6及以後版本中。

