zoukankan      html  css  js  c++  java
  • c#可空值类型

    可空值类型,正如字面意义上的,是可以为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);
  • 相关阅读:
    C++中整型变量的存储大小和范围
    A1038 Recover the Smallest Number (30 分)
    A1067 Sort with Swap(0, i) (25 分)
    A1037 Magic Coupon (25 分)
    A1033 To Fill or Not to Fill (25 分)
    A1070 Mooncake (25 分)
    js 获取控件
    C#代码对SQL数据库添加表或者视图
    JS 动态操作表格
    jQuery取得下拉框选择的文本与值
  • 原文地址:https://www.cnblogs.com/xiaohua19920/p/9598605.html
Copyright © 2011-2022 走看看