<NET CLR via c# 第4版>笔记 第19章 可空值类型

System.Nullable<T>结构.

19.1 C# 对可空值类型的支持

  • C# 允许用问号表示法来声明可空值类型,如:
    Int32? x = 5;
    Int32? y = null;
  • System.Nullable<T>应用操作符解析规则:
    • 一元操作符(+, ++, -, --, !, ~) 操作数是 null ,结果就是 null.
    • 二元操作符(+, -, *, /, %, &, |, ^, <<, >>) 两个操作数任何一个是 null ,结果就是 null . 但有一个例外,它发生在将 &| 操作符应用于 Boolean? 操作数的时候.这种情况和 SQL 的三值逻辑一样.都不为 null ,正常计算;都为 null ,结果为 null ;其一为 null 时,见下面示例:
      null & true = null ; null | true = true ; null & false = false ; null | false = null ;
    • 相等操作符(==, !=) 两个操作数都是 null,两者相等; 一个操作数是 null, 两者不相等;两个操作数都不是 null,就比较值来判断是否相等.
    • 关系操作符(<, >, <=, >=) 两个操作数任何一个是 null,结果就是 false ,两个操作数都不是 null,就比较值.
  • 操作可空实例会生成大量代码,且速度慢于非可空类型.
  • 定义自己的值类型来重载操作符,编译器能正确识别它并调用你重载的操作符(方法).

19.2 C# 的空接合操作符

  • C# 提供了一个"空接合操作符",即 ?? 操作符,它要取两个操作数.假如左边的操作数不为 null,就返回这个操作数的值,否则,就返回右边的操作数的值.
  • 既可用于引用类型,也能用于可空值类型.
        int? b = null;

        //下面等价于:
        // x =(b.HasValue) ? b.Value : 123
        int x = b ?? 123;
        Console.WriteLine(x);   // "123"
        
        //下面这行等价于:
        // string temp = GetFilename();
        // filename = (temp != null) ? temp : "Untitled";
        string filename = GetFilename() ?? "Untitled";

19.3 CLR 对可空值类型的特殊支持

  • 装箱: 当 CLR 对 Nullable<T> 实例进行装箱时,会检查它是否为 null .如果是,CLR 不装箱任何东西,直接返回 null . 如果不为 null , CLR 从可空实例中取出值并进行装箱.
  • 拆箱:
        //创建已装箱的 Int32
        object o = 5;

        //把它拆箱为一个 Nullable<int>和一个int
        int? a = (int?)o;   // a = 5
        int b = (int)o;     // a = 5

        //创建初始化为null的一个引用
        o = null;

        a = (int?)o;    // a = null
        b = (int)o;     // NullReferenceException
  • Nullable<T> 对象上调用 GetType,会返回 T 的类型
  • Nullable<Int32> 类型的变量 n 可以转型为接口类型 IComparable<Int32>
        int? n = 5;
        int result = ((IComparable)n).CompareTo(5);
        Console.WriteLine(result);
posted on 2017-08-22 14:17  Harry(悟秀)  阅读(205)  评论(0编辑  收藏  举报