<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);
<NET CLR via c# 第4版>笔记 第19章 可空值类型的更多相关文章
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...
- <NET CLR via c# 第4版>笔记 第18章 定制特性
18.1 使用定制特性 FCL 中的几个常用定制特性. DllImport 特性应用于方法,告诉 CLR 该方法的实现位于指定 DLL 的非托管代码中. Serializable 特性应用于类型,告诉 ...
- <NET CLR via c# 第4版>笔记 第17章 委托
17.1 初识委托 .net 通过委托来提供回调函数机制. 委托确保回调方法是类型安全的. 委托允许顺序调用多个方法. 17.2 用委托回调静态方法 将方法绑定到委托时,C# 和 CLR 都允许引用类 ...
- <NET CLR via c# 第4版>笔记 第16章 数组
//创建一个一维数组 int[] myIntegers; //声明一个数组引用 myIntegers = new int[100]; //创建含有100个int的数组 //创建一个二维数组 doubl ...
- <NET CLR via c# 第4版>笔记 第13章 接口
13.1 类和接口继承 13.2 定义接口 C#用 interface 关键字定义接口.接口中可定义方法,事件,无参属性和有参属性(C#的索引器),但不能定义任何构造器方法,也不能定义任何实例字段. ...
- <NET CLR via c# 第4版>笔记 第12章 泛型
泛型优势: 源代码保护 使用泛型算法的开发人员不需要访问算法的源代码.(使用c++模板的泛型技术,算法的源代码必须提供给使用算法的用户) 类型安全 向List<DateTime>实例添加一 ...
- <NET CLR via c# 第4版>笔记 第6章 类型和成员基础
6.1 类型的各种成员 6.2 类型的可见性 public 全部可见 internal 程序集内可见(如忽略,默认为internal) 可通过设定友元程序集,允许其它程序集访问该程序集中的所有inte ...
- <NET CLR via c# 第4版>笔记 第7章 常量和字段
7.1 常量 常量 是值从不变化的符号.定义常量符号时,它的值必须能够在编译时确定. 只能定义编译器识别的基元类型的常量,如果是非基元类型,需把值设为null. 常量的值直接嵌入代码,所以不能获取常量 ...
- <NET CLR via c# 第4版>笔记 第8章 方法
8.1 实例构造器和类(引用类型) 构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零 .没有被构造器显式重写的所有字段都保证获得 0 或 null 值. 构造器不能被继承 ...
随机推荐
- The DELETE statement conflicted with the REFERENCE constraint
Page是主表,主键是pageid:UserGroupPage表中的PageID字段是Page表里的数据. https://www.codeproject.com/Questions/677277/I ...
- perl入门知识(3)
引用 在很多场合下使用引用传值,能在很大程度上提高代码的运行效率. 定义一个引用在变量名前加”\”就可以了,如: $ra=\$a; $rb=\@b; ...
- Unity 之 Vector3
class Variables one 指向(0,0,0) zero 指向(1,1,1) right指向 x轴的方向 Up 指向 y轴的方向 forward 指向 z轴的方向
- php能干什么?
什么是cookies 简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机.当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookie 会帮 ...
- c#传统SqlTransaction事务和TransactionScope事务
事务有很多种,看了一些关于事务的问题,这里做下笔记····· 事务时单个的工作单位.如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中永久的组成部分.若果事务遇到错误,则必须取消或 ...
- 获取String类型汉字乱码,如何进行编码
本文为博主原创,未经允许不得转载: 在解析properties文件中的汉字时,在java代码中解析得到的是一个乱码字符,形如图下: 导致乱码原因:由于在jdk中,默认为gbk编码方式进行编码盒接收的, ...
- 肿瘤基因组学数据库终结者:cBioPortal---转载
转载自:http://blog.sciencenet.cn/blog-1509670-1000479.html 随着芯片和高通量测序技术的广泛应用,在肿瘤研究领域积累了越来越多的基因组学数据,特别是像 ...
- python ros 创建节点订阅robot_pose
建立文件夹hello_rospy,再在该目录下建立子目录src,cd到该src目录,运行如下命令创建工作包 catkin_create_pkg beginner_tutorials std_msgs ...
- python 将元组解析为多个参数
#create a tuple tuplex = , , print(tuplex) n1, n2, n3 = tuplex #unpack a tuple in variables print(n1 ...
- Jmeter 4.0 扩展插件
今天发现Jmeter4.0 也可以安装插件 而且比之前的版本的安装方法更为容易 https://jmeter-plugins.org/ https://jmeter-plugins.org/insta ...