zoukankan      html  css  js  c++  java
  • C# 2的重大改进之可空类型

    C# 2的重大改进之可空类型

    在操作数据库时,经常需要为DateTime设置可空值。在C# 1时是无法为DateTime赋值为null的。

    C# 1如何解决可空类型

    三种方式:

    1. 魔法数:牺牲一个值,来表示空值。
    2. 引用类型包装:使用一个包含值类型字段的包装类型。这样就可以直接赋值为null了,问题是会造成GC的压力。或者直接使用object作为类型,再根据需要进行装箱或拆箱。
    3. 额外的布尔值:创建新的类型,包含布尔值和一个实例字段,由于使用的是值类型,可以避免GC的问题。
      无论如何上述三种方式还是挺麻烦的,所以C# 2做出了改进——可空类型。

    C# 2的可空类型

    可空类型:System.Nullable<T>以及可空类型的工具类System.Nullable
    可空类型有HasValue和Value两个属性,看图:

    可空类型的装箱与拆箱

    可空类型是一个结构——值类型。所以把它转换为引用类型时需要进行装箱。但是由于可空类型的特殊性,CLR会让可空类型的装箱有两种,装箱为空引用,或者装箱成T的一个已装箱的值。

    对应的拆箱行为,已装箱的值可以拆箱成普通值类型,或者对应的可空类型(已赋值),但是拆箱空引用时,只能拆箱为可空类型(未赋值),拆箱成普通值类型会抛出NullReferenceException。

    Nuallable可空类型的工具类

    比较方法:

    • public static int Compare<T>(Nuallable<T> n1, Nuallable<T> n2)
    • public static bool Equals<T>(Nullable<T> n1, Nuallable<T> n2)
      两个方法都遵循约定:空值与空值相等,都小于其它所有值。

    还有一个工具方法——获取可空类型的基本类型:
    public static Type GetUnderlyingType(Type nullableType)

    C# 2为可空类型提供的语法糖——?修饰符

    C#编译器允许使用null在比较和赋值时表示一个可空类型的空值。int? nullable = 5;

    C# 2中as操作符可以用于可空类型

    int? nullable = o as int?;

    空合并操作符——??

    first ?? second首先对first进行求值,如果first != null,就返回first的结果,否则就对second进行求值作为整个表达式的结果。
    空合并操作符是右结合的,first ?? second ?? third等价于first ?? (second ?? third)
    将可空类型赋值给它的基本类型时会发生隐式类型转换。所以空合并运算符可以用于可空类型。





  • 相关阅读:
    tomcat控制台运行窗口中文乱码
    jquery html5 file 上传图片显示图片
    修改输入框placeholder文字默认颜色-webkit-input-placeholder
    H5移动端知识点总结
    PostgreSQL
    PostgreSQL
    Hexo系列(2)
    SQL
    Java笔记-序列化的注意点
    js、css外部文件的相对路径问题
  • 原文地址:https://www.cnblogs.com/qianzi067/p/6040757.html
Copyright © 2011-2022 走看看