• <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);
    
  • 相关阅读:
    函数配接器
    函数对象和函数指针
    unary_function 和 binary_function
    堆排序
    Shell排序
    volatile理解
    死锁
    进程间通信
    优化循环的方法-循环展开
    如何学习编译原理
  • 原文地址:https://www.cnblogs.com/harry-wang/p/7410559.html
Copyright © 2020-2023  润新知