1. 程式人生 > >C# --- 可空值類型

C# --- 可空值類型

空類 tel static 調用接口 type operator The color xpl

C#可空類型的實現邏輯:

 1 public struct Nullable<T> where T : struct
 2 {
 3     private bool hasValue;// = false;
 4     internal T value;// = default(T);
 5 
 6     public Nullable(T val)
 7     {
 8         value = val;
 9         hasValue = true;
10     }
11 
12     public bool HasValue
13
{ 14 get 15 { 16 return hasValue; 17 } 18 } 19 20 public T Value 21 { 22 get 23 { 24 if (!hasValue) 25 { 26 throw new InvalidOperationException("Nullable object must have a value
"); 27 } 28 return value; 29 } 30 } 31 32 public T GetValueOrDefault() 33 { 34 return value; 35 } 36 37 public T GetValueOrDefault(T defaultValue) 38 { 39 if (!HasValue) 40 return defaultValue; 41 return
value; 42 } 43 44 public override bool Equals(object other) 45 { 46 if (!HasValue) 47 return other == null; 48 49 if (other == null) 50 return false; 51 52 return value.Equals(other); 53 } 54 55 public override int GetHashCode() 56 { 57 if (!HasValue) return 0; 58 return value.GetHashCode(); 59 } 60 61 public override string ToString() 62 { 63 if (!HasValue) 64 return ""; 65 66 return value.ToString(); 67 } 68 69 //隱式的類型轉換 70 public static implicit operator Nullable<T>(T value) 71 { 72 return new Nullable<T>(value); 73 } 74 75 //顯式的類型轉換 76 public static explicit operator T(Nullable<T> value) 77 { 78 return value.Value; 79 } 80 }

1、裝箱與拆箱

  可空值類型的裝箱:若可空值類型的為null,直接返回null,不進行任何裝箱操作;否則進行正常的裝箱操作.

  可空值類型的拆箱操作:一個已裝箱的值類型 T 可以拆箱為一個 T 或者 Nullable<T>;若已裝箱的值類型為 null,拆箱為Nullable<T>,其值為 null

1 Object obj = 5;  //值類型裝箱
2 
3 Int32 valObj = (Int32)obj;
4 Nullable<Int32> nullableObj = (Nullable<Int32>)obj;
5 
6 
7 obj = null;
8 nullableObj = (Nullable<Int32>)obj;     //null
9 valObj = (Int32)obj;                    //報異常

2、通過可空值類型調用 GetType(),結果是對應的值類型

1 Nullable<Int32> test = 147;
2 Console.WriteLine(test.GetType());   //結果是 System.Int32,而不是 Nullable<Int32>

3、通過可空值類型調用接口方法,可正常使用

1 Nullable<Int32> val = 41;
2 Int32 result = ((IComparable)val).CompareTo(41);
3 Console.WriteLine(result);     //0

C# --- 可空值類型