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