19.可空值类型
在CLR中,没法将int等值类型的值表示为null,而Nullable<int>
能表示可空的值类型,在Nullable<int>
内部只是多了一个bool字段HasValue。
private static void UsingNullableValue()
{
Nullable<int> x = 5;
Nullable<int> y = null;
Console.WriteLine("x:HasValue = {0}, Value = {1}", x.HasValue, x.Value);
Console.WriteLine("y:HasValue = {0}, Value = {1}", y.HasValue, y.GetValueOrDefault());
}
输出:
x:HasValue = True, Value = 5
y:HasValue = False, Value = 0
19.1C#对可空值类型的支持
C#提供了更简便的语法来处理可空值类型,Int32?
等价于Nullable<int>
private static void ConversionsAndCasting() // C#允许在可空实例上执行转换和转型
{
Int32? a = 5; // 隐式转换Implicit
Int32? b = null;
Int32 c = (Int32)a; // 显示转换Explicit
Double? d = 5; // 转型,d=5.0
Double? e = b; // e = null
}
private static void Operators() // C#还允许在可空实例上应用操作符
{
Int32? a = 5;
Int32? b = null;
a++; // a = 6
b = -b; // b = null
if (a == null) { /* no */ }
if (a < b) { /* no */ } // 两个操作数任何一个是null,结果就是false
}
19.2C#的空接合操作符
空接合操作符即"??",假如左边的操作数不为null,就返回这个操作数的值;假如左边的操作数为null,就返回右边的操作数的值。既能用于引用类型,也能用于可空类型。
// 举例1
private static void NullCoalescingOperator()
{
Int32? b = null;
Int32 x = b ?? 123;
Console.WriteLine(x); // "123"
}
// 举例2
String str = GetFirstString() ?? GetSecondString() ?? "xxx";
19.3CLR对可空值类型的特殊支持
这个特殊的支持是针对装箱、拆箱、调用GetType等提供的。
如果可空实例为null,Int32? n = null; Object o = n;
则不进行装箱,直接返回null;否则,要进行装箱。拆箱同理。
// 在Nullable<T>对象上调用GetType
private static void GetTypeOfNullable()
{
Int32? x = 5;
Console.WriteLine(x.GetType()); // "System.Int32" not "System.Nullable<Int32>"
}