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);

<NET CLR via c# 第4版>笔记 第19章 可空值类型的更多相关文章

  1. <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型

    5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...

  2. <NET CLR via c# 第4版>笔记 第18章 定制特性

    18.1 使用定制特性 FCL 中的几个常用定制特性. DllImport 特性应用于方法,告诉 CLR 该方法的实现位于指定 DLL 的非托管代码中. Serializable 特性应用于类型,告诉 ...

  3. <NET CLR via c# 第4版>笔记 第17章 委托

    17.1 初识委托 .net 通过委托来提供回调函数机制. 委托确保回调方法是类型安全的. 委托允许顺序调用多个方法. 17.2 用委托回调静态方法 将方法绑定到委托时,C# 和 CLR 都允许引用类 ...

  4. <NET CLR via c# 第4版>笔记 第16章 数组

    //创建一个一维数组 int[] myIntegers; //声明一个数组引用 myIntegers = new int[100]; //创建含有100个int的数组 //创建一个二维数组 doubl ...

  5. <NET CLR via c# 第4版>笔记 第13章 接口

    13.1 类和接口继承 13.2 定义接口 C#用 interface 关键字定义接口.接口中可定义方法,事件,无参属性和有参属性(C#的索引器),但不能定义任何构造器方法,也不能定义任何实例字段. ...

  6. <NET CLR via c# 第4版>笔记 第12章 泛型

    泛型优势: 源代码保护 使用泛型算法的开发人员不需要访问算法的源代码.(使用c++模板的泛型技术,算法的源代码必须提供给使用算法的用户) 类型安全 向List<DateTime>实例添加一 ...

  7. <NET CLR via c# 第4版>笔记 第6章 类型和成员基础

    6.1 类型的各种成员 6.2 类型的可见性 public 全部可见 internal 程序集内可见(如忽略,默认为internal) 可通过设定友元程序集,允许其它程序集访问该程序集中的所有inte ...

  8. <NET CLR via c# 第4版>笔记 第7章 常量和字段

    7.1 常量 常量 是值从不变化的符号.定义常量符号时,它的值必须能够在编译时确定. 只能定义编译器识别的基元类型的常量,如果是非基元类型,需把值设为null. 常量的值直接嵌入代码,所以不能获取常量 ...

  9. <NET CLR via c# 第4版>笔记 第8章 方法

    8.1 实例构造器和类(引用类型) 构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零 .没有被构造器显式重写的所有字段都保证获得 0 或 null 值. 构造器不能被继承 ...

随机推荐

  1. 【ssh免登录】设置集群环境ssh免登录步骤

    1.每台机器都需要执行,生成自己的密钥 # ssh-keygen -t rsa 过程中遇到选项,全部enter #cd ~/.ssh # cat id_rsa.pub > authorized_ ...

  2. java 插件安装

    Emmet插件 : https://www.cnblogs.com/lxjshuju/p/7136420.html 使用方法: 在JSP中使用快捷键 ctrl+e 同其他文件的TAB键

  3. UVa 1660 电视网络(点连通度+最小割最大流+Dinic)

    https://vjudge.net/problem/UVA-1660 题意:给出一个无向图,求出点连通度.即最少删除多少个点,使得图不连通. 思路: 如果求线连通度的话,直接求个最大流就可以了.但这 ...

  4. ubuntu 14.04 (desktop amd 64) 下载

    http://cdimage.ubuntu.com/ubuntukylin/releases/14.04/release/

  5. Ubuntu 添加,删除ppa

    PPA,英文全称为 Personal Package Archives,即个人软件包档案.是 Ubuntu Launchpad 网站提供的一项源服务,允许个人用户上传软件源代码,通过 Launchpa ...

  6. cocos2dx 在windows下开启console

    cocos2dx 3.10 1.在main函数中写入代码 AllocConsole(); freopen("CONIN$", "r", stdin); freo ...

  7. Codeforces 496D - Tennis Game

    496D - Tennis Game 思路:枚举每个t,求出对应的满足条件的s. 代码: #include<bits/stdc++.h> using namespace std; #def ...

  8. [Java学习] Java字符串(String)

    从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串: String stringName = ...

  9. English trip WeekEnd-Lesson 2018.11.10

    本周末上了三节课,做个小结吧\(^o^)/~: [102] 新概念一早读 - 27 - 28        Teacher: March Mrs. Smith's living room is lar ...

  10. Gluttony CodeForces - 892D (构造,思维)

    题面: You are given an array a with n distinct integers. Construct an array b by permuting a such that ...