跳至頁尾內容
Iron Academy Logo
C# 和 .NET 的新功能

在 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及以後版本中。

Hero Worlddot related to 在 10 分鐘或更短時間內 C# 10 和 .NET 6 中的 Null 參數檢查
Hero Affiliate related to 在 10 分鐘或更短時間內 C# 10 和 .NET 6 中的 Null 參數檢查

分享您所愛以賺取更多報酬

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

Iron 支援團隊

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