<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>

          使用int?來確保值類型也可以為null

          共 1129字,需瀏覽 3分鐘

           ·

          2021-03-01 23:22

          繼上一篇“你確認(rèn)C#中TryParse比Parse好?動(dòng)手測(cè)試才知道!”后,本文繼續(xù)講《編寫高質(zhì)量代碼改善C#程序的157個(gè)建議》一書第5個(gè)建議“使用int?來確保值類型也可以為null”。喜歡本書請(qǐng)到各大商城購買原書,支持正版。

          基元類型為什么需要為null?考慮兩個(gè)場(chǎng)景:

          1. 數(shù)據(jù)庫中一個(gè)int字段可以被設(shè)置為null。在C#中,值被取出來后,為了將它賦值給int類型,不得不首先判斷一下它是否為null。如果將null直接賦值給int 類型,會(huì)引發(fā)異常。

          2. 在一個(gè)分布式系統(tǒng)中,服務(wù)器需要接收并解析來自于客戶端的數(shù)據(jù)。一個(gè)int型數(shù)據(jù)可能在傳輸過程中丟失或被篡改了,轉(zhuǎn)型失敗后應(yīng)該保存為null值,而不是提供一個(gè)初始值。

          類似的場(chǎng)景還有很多,所以從.NET 2.0開始,F(xiàn)CL中提供了一個(gè)額外的類型:可以為空的類型Nullable。它是一個(gè)結(jié)構(gòu)體,聲明如下:

          [SerializableAttribute]
          public?struct?Nullable<T>?where?T?:?struct

          因?yàn)槭墙Y(jié)構(gòu)體,所以只有值引用類型才可以作為“可以為空的類型”(引用類型本身就可以為null)。一個(gè)可以為空的int類型表示為:

          Nullableeint>?i?=?null;

          它也可以表示為:

          int??i?=?null;

          語法T?是 Nullable的簡(jiǎn)寫,兩者可以相互轉(zhuǎn)換。可以為 null 的類型表示其基礎(chǔ)值類型正常范圍內(nèi)的值再加上一個(gè)null值。例如,Nullable,其值的范圍為—2147 483 648~2 147 483 647,再加上一個(gè)null值。

          現(xiàn)在來看看可空類型和基元類型的互相轉(zhuǎn)換。基元類型提供了其對(duì)應(yīng)的可空類型的隱式轉(zhuǎn)換,如下所示:

          int??i?=?null;
          int?j?=?0;
          i?=?j;

          反過來,可空類型不可隱式轉(zhuǎn)換為對(duì)應(yīng)的基元類型,正確的轉(zhuǎn)換形式如下:

          int??i?=?123;
          int?j;
          if?(i.Hasvalue)
          {
          ??j?=?i.value;
          }
          else
          {
          ??j?=?0;
          )

          但是,這段代碼看上去是不是有點(diǎn)煩瑣?所以,在闡述可空類型的時(shí)候,不得不提到??運(yùn)算符。??最大的用處就是將可空類型的值賦值給對(duì)應(yīng)的基元類型進(jìn)行簡(jiǎn)化,上文代碼的一個(gè)簡(jiǎn)化形式就是:

          int??i?=?123;
          int?j?=?i????0;

          int j = i ?? 0;表示的意思是,如果i的HasValue為 true,則將i的value賦值給j:否則,就給j賦值為0。

          下一篇我們接著讀《建議6:區(qū)別readonly和const的使用方法 》,歡迎關(guān)注微信公眾號(hào)【小市民在西河】。

          瀏覽 62
          點(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>
                  av天堂中文版 | 天天鲁天天谢天天擦 | 色哟哟精品 | 亲子乱婬一级A片 | 免费在线黄色视频 |