<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1769字,需瀏覽 4分鐘

           ·

          2020-12-28 11:31


          作者:依樂(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)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了


          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人特级毛片69免费观看 | 欧美精品一区二区三区使用方法 | 成人豆花视频 | 91麻豆精品国产91久久久资源速度 | 香蕉视频在线观看网站资源 |