跳過到頁腳內容
Iron Academy Logo
C#和.NET中的新特性

C# 10和.NET 6中的空參數檢查在10分鐘內完成

Tim Corey
4m 49s

當使用C#時,開發者經常會遇到傳遞到方法中的空參數。 這可能會導致意外行為、執行時錯誤,甚至是未處理的異常,如果沒有妥善處理的話。 在他的视频"Null Parameter Checks in C# 10 and .NET 6 in 10 Minutes or Less"中,Tim Corey解釋了C# 10如何使用ArgumentNullException類簡化空值的處理。

在這篇文章中,我們將按照Tim的解釋,逐步了解空檢查的工作原理以及它們在現代C#中的改進。

設定情境 – 檢查空參數

Tim首先創建了一個簡單的.NET 6控制台應用程式,來展示如何在C#中處理空參數檢查。 他清除了樣板代碼並聲明了一個可空字串變數:

string? info = null;
string? info = null;

這個空對象代表了一種情況,即方法調用可能會接收到未正確實例化的參數。 然後Tim定義了一個簡單的方法:

void SayHi(string message)
{
    Console.WriteLine($"Hello {message}");
}
void SayHi(string message)
{
    Console.WriteLine($"Hello {message}");
}

他將info變量傳遞給該方法:

SayHi(info);
SayHi(info);

當程式執行時,輸出顯示為:

Hello

不會發生異常,因為字串連接接受空值並將其視為空字串。 但是,正如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及之後的版本中。

Hero Worlddot related to C# 10和.NET 6中的空參數檢查在10分鐘內完成
Hero Affiliate related to C# 10和.NET 6中的空參數檢查在10分鐘內完成

通過分享您所愛的東西賺得更多

您是否在為使用.NET、C#、Java、Python或Node.js的開發者創建內容?將您的專業知識轉化為額外收入!

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我