C# --- 可空值类型


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、通过可空值类型调用接口方法,可正常使用

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn