可空类型(Nullable<T>)及其引出的关于explicit、implicit的使用_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 可空类型(Nullable<T>)及其引出的关于explicit、implicit的使用

可空类型(Nullable<T>)及其引出的关于explicit、implicit的使用

 2015/2/11 19:35:09  alert(dong)  程序员俱乐部  我要评论(0)
  • 摘要:问题一:Nullable<T>可赋值为null先看两行C#代码int?i1=null;int?i2=newint?();int?即Nullable<int>,就像int之于Int32;Nullable<T>是非常特殊结构类型,它可赋值为null(所以此前我还以为是引用类型),其本质是等同于new;通过调试可发现上述两个值均为null,但是事实上我们却可以调用他们的一些属性方法比如“HasValue”,由此可见&ldquo
  • 标签:使用

问题一:Nullable<T>可赋值为null

先看两行C#代码

            int? i1 = null;
            int? i2 = new int?();        

int? 即Nullable<int>,就像int之于Int32;

Nullable<T>是非常特殊结构类型,它可赋值为null(所以此前我还以为是引用类型),其本质是等同于new;

通过调试可发现上述两个值均为null,但是事实上我们却可以调用他们的一些属性方法比如“HasValue”,由此可见“=null“只是障眼法罢了;

此时如果调用他们的”Value“属性将引发”InvalidOperationException“异常,注意不是空引用异常,异常信息为”其他信息: 可为空的对象必须具有一个值。”;

建议对于此类型的取值使用“GetValueOrDefault”方法来获取,而不是判断HasValue后去Value值;

其次建议不进行” == null “的逻辑判断,应使用HasValue属性。

 

问题二:Nullable<T> 可赋值为 T类型

 仍然看两行C#代码

            int? iNull = 2;
            int i = (int)iNull;

非常常见的代码,但是每行代码都包含了类型,“int?”与int之间的隐式转换与显示转换,而支持可空类型转换的就是Nullable<T>提供了两个方法:

        public static explicit operator T(Nullable<T> value);
        public static implicit operator Nullable<T>(T value);

operator是运算符重载,因而这俩货也可以看成是对“=”的运算符重载,explicit支持了显示转换,implicit支持了隐式转换,使用如下:

    class UserInfo
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public static explicit operator UserInfo(int id)
        {
            Console.WriteLine("获取用户ID为【{0}】的User对象", id);
            return new UserInfo { ID = id };
        }

        public static implicit operator UserInfo(string name)
        {
            Console.WriteLine("获取用户名为【{0}】的User对象", name);
            return new UserInfo { Name = name };
        }
    }

调用:

            UserInfo user1 = (UserInfo)2;

            UserInfo user2 = "bajie";

 

上一篇: 拿到期权,就能一飞冲天? 下一篇: 没有下一篇了!
发表评论
用户名: 匿名