zoukankan      html  css  js  c++  java
  • 【C#进阶系列】19 可空值类型

    可空值类型,正如字面意义上的,是可以为NULL的值类型。

    这个东西存在的意义可以解决比如数据库的的Int可以为NUll的情况,使得处理数据库数据更简单。

    实际上可空值类型就是Nullable<T>这个泛型值类型,而C#有一种更简单的语法糖是int?这种用法:

    Nullable<Int32> 数据库类型 = null;
    float? 可以为空的浮点类型 = null;
    DateTime? 更多的值类型 = null;

    可空值类型的更多玩法

    在大多数时候用C#去操作可空值类型,完全可以把它当做一个没有?的值类型去处理。

    以下是一些玩法示例:

            Int32? 可空类型 = 5;//值类型可隐式转换为可空类型
                int 值类型 = (Int32)可空类型;//可空类型可以强制转换为值类型
                //当然你也可以用下面这两种玩法将可控类型转换为值类型
                值类型 = 可空类型.Value;//这种玩法一般是可以的,但是当可空类型值为null时会抛异常
                值类型 = 可空类型.GetValueOrDefault(123);// 如果不为空就获取可空类型的value,为null则为指定的数字123,不指定参数也行,那会返回值类型的默认值。
                //值类型也可用于操作符
                可空类型++;//对于一元操作符,可空类型值为null则结果为null,不为null则结果和一般值类型一样
                可空类型= 可空类型+ 值类型;//对于二元操作符,两个操作数之间有一个为null结果就为null,如果都不为null结果和一般值类型一样
                //有一种特殊情况就是&和|应用于Boolean?操作数的时候。
                //对于 &操作,只要有一个为false那么结果为false,都没有false那么有null就为null,最后一种情况为true
                //对于|操作,只要有一个为true那么结果为true,都没有true那么有null就为null,最后一种情况为false

    注意操作可空类型实例会生成大量代码,即使只是一个简单的a+b也会有很多代码。

    当你用这个东西的时候,可以想象会先去new Nullable<T>的实例,且进行操作之前都会去判断是否为null,判断成功再去操作实例的value。所以它的速度相对于正常的值类型来讲肯定会慢一点。

    C#的空接合操作符 

    即??操作符。如果??左边的操作数不为null,那么就返回这个数,否则就返回右边的操作数。

    对于可空值类型而言,这个效果和前面的GetValueOrDefault()并指定参数的效果一样。

    然而它不仅仅只是用于可空值类型,还可以用于引用类型。

    值类型 = 可空类型 ?? 123;
    String 引用类型 = GetSomeString() ?? "Troy说:这是一个空文本";

    CLR中可空值类型的装箱与拆箱

    前面讲到可空值类型其实还是值类型,所以依然存在装箱和拆箱的问题。

    然而CLR对可空值的装箱和拆箱执行了一些特殊代码:

    可空值类型装箱会先去判断是否为null,为null就直接传null给引用类型,无需装箱。不为null就取它的value,再对这个value进行装箱。

    可空值类型拆箱也很简单,如果引用类型为null就直接赋值为null,否则按照正常拆箱逻辑走。

    CLR的对于可空值类型的一些特殊处理

    可空值类型用GetType返回的是其value的类型而不是实际的类型。因为实际上我们这么玩的时候想得到的当然是value的类型,而不是Nullable<T>类型。所以CLR这里做了这个处理。

    Console.WriteLine(可空类型.GetType());//返回的是System.Int32,而不是System.Nullable<Int32>

    通过可空值类型调用接口方法

    public struct Nullable<T> where T : struct

    以上是Nullable<T>的定义,可以看到它并没有继承什么接口。

    但是它却可以调用值类型T实现的接口方法:

    Int32 result = ((IComparable)可空类型).CompareTo(5);//允许的做法,相当于下面这种玩法,只是说CLR在这方面做了简化处理
    result = ((IComparable)(Int32)可空类型).CompareTo(5);
  • 相关阅读:
    frida rpc调用维护ios手机脚本
    latex表格调整行距
    latex插图自动在双栏的最top,IEEE期刊格式
    latex插图egin{minipage}强制左移hspace命令
    SYNTHIA-RAND-CITYSCAPES数据集云盘下载
    一种用于多张图片同时缩放比较细节的软件faststone
    shopxo安装插件被限制绑定账号的问题
    ShopXo框架去掉绑定商店的提示
    拓扑排序
    前缀和和差分
  • 原文地址:https://www.cnblogs.com/vvjiang/p/5339655.html
Copyright © 2011-2022 走看看