zoukankan      html  css  js  c++  java
  • 可空类型(Nullable<T>)及其引出的关于explicit、implicit的使用

    问题一: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";
  • 相关阅读:
    常用WebService一览表
    Generic Data Access Objects [转]
    spring hibernate properties详解
    SpringMVC常用基础知识【转】
    向PLSQL导入txt,csv文件
    打印金字塔图案
    经常使用的文件工具类
    求两个数的最大公约数
    155个建议笔记1
    用Tika读取文件(不需要考虑文件格式)
  • 原文地址:https://www.cnblogs.com/FreeDong/p/4286720.html
Copyright © 2011-2022 走看看