C# 2的重大改进之可空类型
C# 2的重大改进之可空类型
C# 2的重大改进之可空类型
C# 1如何解决可空类型
C# 2的可空类型
可空类型的装箱与拆箱
Nuallable可空类型的工具类
C# 2为可空类型提供的语法糖——?修饰符
C# 2中as操作符可以用于可空类型
空合并操作符——??
C# 1如何解决可空类型
C# 2的可空类型
可空类型的装箱与拆箱
Nuallable可空类型的工具类
C# 2为可空类型提供的语法糖——?修饰符
C# 2中as操作符可以用于可空类型
空合并操作符——??
在操作数据库时,经常需要为DateTime设置可空值。在C# 1时是无法为DateTime赋值为null的。
C# 1如何解决可空类型
三种方式:
- 魔法数:牺牲一个值,来表示空值。
- 引用类型包装:使用一个包含值类型字段的包装类型。这样就可以直接赋值为null了,问题是会造成GC的压力。或者直接使用object作为类型,再根据需要进行装箱或拆箱。
- 额外的布尔值:创建新的类型,包含布尔值和一个实例字段,由于使用的是值类型,可以避免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)
。
将可空类型赋值给它的基本类型时会发生隐式类型转换。所以空合并运算符可以用于可空类型。