C#中煩人的Null值判斷竟然這樣就被消滅了

作者:依樂(lè)祝
首發(fā)自:DotNetCore實(shí)戰(zhàn) 公眾號(hào)
https://www.cnblogs.com/yilezhu/p/14177595.html
Null值檢查應(yīng)該算是開(kāi)發(fā)中最常見(jiàn)且煩人的工作了吧,有人反對(duì)嗎?反對(duì)的話請(qǐng)右上角關(guān)門不送。這篇文章就教大家一招來(lái)簡(jiǎn)化這個(gè)煩人又不可避免的工作。
羅嗦話不多說(shuō),先看下面一段簡(jiǎn)單的不能再簡(jiǎn)單的null值判斷代碼:
public void DoSomething(string message)
{
if(message == null)
throw new ArgumentNullException();
// ...
}
方法體的每個(gè)參數(shù)都將用if語(yǔ)句進(jìn)行檢查,并逐個(gè)拋出?ArgumentNullException?的異常。
關(guān)注我的朋友,應(yīng)該看過(guò)我上篇《一個(gè)小技巧助您減少if語(yǔ)句的狀態(tài)判斷》的文章,它也是簡(jiǎn)化Null值判斷的一種方式。簡(jiǎn)化后可以如下所示:
public void DoSomething(string message)
{
Assert.That(message == null, nameof(DoSomething));
// ...
}
但是還是很差強(qiáng)人意。
**
NotNullAttribute
這里你可能想到了?_System.Diagnostics.CodeAnalysis_?命名空間下的這個(gè) [NotNull] 特性。這不會(huì)在運(yùn)行時(shí)檢查任何內(nèi)容。它只適用于CodeAnalysis,并在編譯時(shí)而不是在運(yùn)行時(shí)發(fā)出警告或錯(cuò)誤!
public void DoSomething([NotNull]string message) // Does not affect anything at runtime.
{
}
public void AnotherMethod()
{
DoSomething(null); // MsBuild doesn't allow to build.
string parameter = null;
DoSomething(parameter); // MsBuild allows build. But nothing happend at runtime.
}
自定義解決方案
這里我們將去掉用于Null檢查的if語(yǔ)句。如何處理csharp中方法參數(shù)的賦值?答案是你不能!. 但你可以使用另一種方法來(lái)處理隱式運(yùn)算符的賦值。讓我們創(chuàng)建?NotNull?類并定義一個(gè)隱式運(yùn)算符,然后我們可以處理賦值。
public class NotNull<T>
{
public NotNull(T value)
{
this.Value = value;
}
public T Value { get; set; }
public static implicit operator NotNull<T>(T value)
{
if (value == null)
throw new ArgumentNullException();
return new NotNull(value);
}
}
現(xiàn)在我們可以使用NotNull對(duì)象作為方法參數(shù).
static void Main(string[] args)
{
DoSomething("Hello World!"); // Works perfectly ?
DoSomething(null); // Throws ArgumentNullException at runtime.
string parameter = null;
DoSomething(parameter); // Throws ArgumentNullException at runtime.
}
public static void DoSomething(NotNull<string> message) // <--- NotNull is used here
{
Console.WriteLine(message.Value);
}
如您所見(jiàn),?DoSomething()?方法的代碼比以前更簡(jiǎn)潔。也可以將NotNull類與任何類型一起使用,如下所示:
public void DoSomething(NotNull<string> message, NotNull<int> id, NotNull product )
{
// ...
}
感謝您的閱讀,我們下篇文章見(jiàn),我是依樂(lè)祝,我為合肥.NET技術(shù)社區(qū)“帶鹽”~
參考自:https://enisn.medium.com/never-null-check-again-in-c-bd5aae27a48e
【推薦】.NET Core開(kāi)發(fā)實(shí)戰(zhàn)視頻課程?★★★
.NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開(kāi)篇及總體規(guī)劃
【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開(kāi)篇及目錄索引
Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)
.NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了
10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼
用abp vNext快速開(kāi)發(fā)Quartz.NET定時(shí)任務(wù)管理界面
在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度
現(xiàn)身說(shuō)法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化
