zoukankan      html  css  js  c++  java
  • <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);
    
  • 相关阅读:
    cmanformat
    mysql-sql语言参考
    jQuery 判断多个 input checkbox 中至少有一个勾选
    Java实现 蓝桥杯 算法提高 计算行列式
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
  • 原文地址:https://www.cnblogs.com/harry-wang/p/7410559.html
Copyright © 2011-2022 走看看