《CLR via C#》基本类型.可空值类型

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>"
}

猜你喜欢

转载自blog.csdn.net/BillCYJ/article/details/94600788