日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
簡介C#可空值類型

通常一個值類型變量永遠不可能為null,它總是包含值類型的值本身。但是在某些情況下會遇到一些問題如:在映射數(shù)據(jù)庫中的一個C#可空值列時,使用Framework來處理數(shù)據(jù)庫數(shù)據(jù)時變得相當(dāng)困難;為了解決這一問題CLR中引入了“C#可空值類型(nullable value type)”

成都創(chuàng)新互聯(lián)公司網(wǎng)絡(luò)公司擁有十多年的成都網(wǎng)站開發(fā)建設(shè)經(jīng)驗,近1000家客戶的共同信賴。提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)站開發(fā)、網(wǎng)站定制、買鏈接、建網(wǎng)站、網(wǎng)站搭建、成都響應(yīng)式網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計師打造企業(yè)風(fēng)格,提供周到的售前咨詢和貼心的售后服務(wù)

為理解它們是如何工作的,先看看CLR中的邏輯:

 
 
 
  1. [Serializable, StructLayout(LayoutKind.Sequential)]     
  2.  public struct Nullable< T> where T : struct    
  3.  {     
  4.      private Boolean hasValue = false; // 用一個字段落表示裝態(tài),初始假定為Null     
  5.      internal T value = default(T);     
  6.      public Nullable(T value)     
  7.      {     
  8.          this.value = value;     
  9.          this.hasValue = true;     
  10.      }     
  11.     
  12.      public bool HasValue { get { return hasValue; } }     
  13.      public T Value     
  14.      {     
  15.          get    
  16.          {     
  17.              if (!hasValue) throw new InvalidOperationException("Nullable object must have a value.");     
  18.              return value;     
  19.          }     
  20.      }     
  21.     
  22.      public T GetValueOrDefault() { return value; }     
  23.      public T GetValueOrDefault(T defaultValue)     
  24.      {     
  25.          if (!HasValue) return defaultValue;     
  26.          return value;     
  27.      }     
  28.      public override bool Equals(object obj)     
  29.      {     
  30.          if (!HasValue) return (obj == null);     
  31.          if (obj == null) return false;     
  32.          return value.Equals(obj);     
  33.      }     
  34.     
  35.      public override int GetHashCode()     
  36.      {     
  37.          if (!HasValue) return 0;     
  38.          return value.GetHashCode();     
  39.      }     
  40.      public override string ToString()     
  41.      {     
  42.          if (!HasValue) return String.Empty;     
  43.          return value.ToString();     
  44.      }     
  45.     
  46.      public static implicit operator Nullable< T>(T value)     
  47.      {     
  48.          return new Nullable< T>(value);     
  49.     
  50.      }     
  51.     
  52.  }   

調(diào)用和輸出: 

 
 
 
  1.    static void Main(string[] args)     
  2.         {     
  3.             Nullable< Int32> x = 5;     
  4.             Nullable< Int32> y = null;     
  5.             Console.WriteLine("x:HasValue {0}, value = {1}", x.HasValue, x.Value);     
  6.             Console.WriteLine("y:HasValue {0}, value = {1}", y.HasValue, y.GetValueOrDefault());     
  7.             Console.ReadLine();     
  8.         }     
  9. 輸出:     
  10.     x:HasValue  True, value = 5     
  11.     y:HasValue False, value = 0    

C#中允許使用問號來申明初始化變量(等同于上面代碼)如:

        Int32? x = 5;

        Int32? y = null;

總結(jié)一下C#可空值類型對操作符的解釋:

a.一元操作符如果操作數(shù)為null,結(jié)果為null;

b.二元操作符中任何一個為null,結(jié)果為null;

c.比較操作符如果兩人個操作數(shù)都為null,兩者相等;如果一個為null,兩者不相等;如果兩個數(shù)都不為null,對值進行比較;

注意:在操作值類型時會生成大量代碼,代碼類似對基類(Nullable)代碼的調(diào)用;

 
 
 
  1. //一元操作符:(+ ++ - -- ! ~)     
  2. x++; // x = 6;     
  3. y--; // y = null;     
  4. //二元操作符:(+ - * / % & | ^ < <  >>)     
  5. x = x + 10; // x = 15;     
  6. y = y * 10; // y = null     
  7. // 比較操作符:(== != <  > < = >=)     
  8. if (x == null) Console.WriteLine("x is null;"); else Console.WriteLine("x is not null;");     
  9. if (y == null) Console.WriteLine("y is null;"); else Console.WriteLine("y is not null;");     
  10. if (x != y) Console.WriteLine("x = y;"); else Console.WriteLine("x != y;");     
  11. if (x > y) Console.WriteLine("x > y;"); else Console.WriteLine("x < = y;");    

當(dāng)CLR對一個Nullable< T>實例進行裝箱時,會檢查它是否為null,如果為null,CLR不實際進行裝箱操作,并會返回null值;

如果實例不為空,將從類型中取出值,并對其進行裝箱如:

 
 
 
  1. Int32? a = null;     
  2.             object o = a; //a 為null     
  3.             Console.WriteLine(" o is null = {0}", o == null); // "true"     
  4.     
  5.             Int32? b = 5;     
  6.             o = b; //a 為null     
  7.             Console.WriteLine(" o's type = {0}", o.GetType()); // "System.Int32" 對可空值類型調(diào)用GetType時CLR會采取欺騙手法返回T,而不是Nullable< T>   

在應(yīng)用可空值類型進行拆箱時,CLR會分配內(nèi)存(這是一個極特殊的行為,在其它所有情況下,拆箱永遠不會導(dǎo)致內(nèi)存的分配),原因在于一個已裝箱的值類型不能簡單的拆箱為值類型的可空版本,在已裝箱的值類型中并不包含Boolean hasValue字段,故在拆箱時CLR必須分配一個Nullable< T>對象,已初始化hasValue = true ,value = 值類型值。這會對應(yīng)用程序性能造成一定影響。

通過C#可空值類型調(diào)用接口方法

 
 
 
  1. Int32? n = 5;     
  2.         Int32 result = ((IComparable)n).CompareTo(5);     
  3.         Console.WriteLine(result); // 0;   

分享名稱:簡介C#可空值類型
本文路徑:http://www.dlmjj.cn/article/dpshghs.html