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";
  • 相关阅读:
    [转]ExtJS3.0与KindEditor4.1.2整合
    [转]Ext.grid常用属性和方法
    Extjs gridpanel 合并单元格
    [转]Httrack工具与使用指南
    [转]Teleport Ultra/Teleport Pro的冗余代码批量清理方法
    [转]最全的用正则批量去除Teleport Pro整站下载文件冗余代码
    Teleport Pro使用教程
    如何通过Dreamweaver批量对整个站点或目录进行代码搜索或部分全部替换
    [转]使用DW正则表达式批量替换实例介绍
    [转]tppabs是什么?如何去除tppabs?
  • 原文地址:https://www.cnblogs.com/FreeDong/p/4286720.html
Copyright © 2011-2022 走看看