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)
将可空类型赋值给它的基本类型时会发生隐式类型转换。所以空合并运算符可以用于可空类型。





posted @ 2016-11-07 21:34  qianzi  阅读(432)  评论(0编辑  收藏  举报