• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#---可空值类型

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#之旅(一):泛型和IComparable、IComparer发布时间:2022-07-13
下一篇:
C#串口通信—向串口发送数据,同步接收返回数据发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap