为什么会有可空值类型:

当我们设计一个数据库时,可将一个数据库字段的数据类型定义成一个32位整数,并映射到FCL的Int32数据类型对象上。在数据库中的一个字段可能允许值为空,用.Net Framework处理数据库数据可能变得相当困难。因为在CLR中,没有办法将Int32值表示为null。为了解决这个问题,Microsoft在CLR中引入了可空值类型        (nullable value type)的概念。

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

可空类型也是值类型,只是它是包含null的一个值类型。

C#用问号表示法来声明并初始化变量。这个”?”修饰符只是C#提供的一个语法糖 (所谓语法糖,就是C#提供的一种方便的形式,肯定没有Int32? 这种类型。编译器认为Int32?就是System.Nullable< Int32>类型,即可空值类型)。

Nullable类型具有一个HasValue的bool类型只读属性,当Nullable类型实例的该属性为true时,则表示该实例是非空实例,包含一个已知值Value。

HasValue为false时,访问Value属性将导致System.InvalidOperationException。
public struct Nullable<T> where T : struct

C#允许在可空类型上执行转换和转型:

public static void ConversionsAndCasting(){//Nullable<Int32> a = 5;Int32? a = 5; //从非可空的Int32转换为Nullable<Int32>          Int32? b = null; //从null隐式转换为Nullable<Int32> Int32 c = (Int32)a; //从Nullable<Int32>显式转换为非可空Int32//在可空基元类型之间转换Double? d = 5;//Int32转型为DoubleDouble? e = b;//Int32?转型为Double
        }

C#允许向可空类型的实例应用操作符:

public static void Operators()
{Int32? a = 5;Int32? b = null;a++;b = -b;a = a + 3;b = b * 3;if (a == null) { } else { }if (b == null) { } else { }if (a != b) { } else { }if (a < b) { } else { }
}

19.2 C#的空接合操作符

为了实现Nullable数据类型转换成non-Nullable型数据,C#提供了空接合操作符,即??操作符,它需要获取两个操作数。假如左边的操作数不为null,就返回左边的这个操作数的值。如果左边的操作数为null,就返回右边的操作数的值。

利用空接合操作符,可以方便地设置变量的默认值。避免在代码中写if / else语句,简化代码数量,从而有利于阅读。

        public static void NullCoalescingOperator(){Int32? b = null;Int32 x = b ?? 123;//等价于x = (b.HasValue) ? b.Value : 123;}

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

其实可空值类型的装箱和拆箱操作大家可以理解为非可空值类型的装箱和拆箱的过程。只是CLR会提前检查下它是否为空,为null就不做任何处理。如果不为null,就按照非可空值类型的装箱和拆箱的过程来装箱和拆箱。

转载于:https://www.cnblogs.com/chrisghb8812/p/5523898.html

第19章 可空值类型相关推荐

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

    System.Nullable<T> 是结构. 19.1 C# 对可空值类型的支持 C# 允许用问号表示法来声明可空值类型,如: Int32? x = 5;Int32? y = null; ...

  2. 第 19 章 XML映射

    第 19 章 XML映射 注意这是Hibernate 3.0的一个实验性的特性.这一特性仍在积极开发中. 19.1. 用XML数据进行工作 Hibernate使得你可以用XML数据来进行工作,恰如你用 ...

  3. java char类型空值_展望Java的未来:空值类型

    java char类型空值 尽管有前途的Java值类型不是迫在眉睫,但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下,以了解事情的进展情况并了解即将发生的事情. 诚然,由于 ...

  4. 展望Java的未来:空值类型

    尽管有前途的Java值类型不是迫在眉睫,但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下,以了解事情的进展情况并了解即将发生的事情. 诚然,由于我对所用术语的了解有限,并且 ...

  5. 第19章,运维自动化之系统安装

    更多内容请点击: Linux学习从入门到打死也不放弃,完全笔记整理(持续更新,求收藏,求点赞~~~~) https://blog.51cto.com/13683480/2095439 第19章,运维自 ...

  6. 第 19 章 迭代器模式

    第 19 章 迭代器模式 1.学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系. 如图: 2.传统方案解决学校院系展 ...

  7. 第19章 数据库备份与恢复

    第19章 数据库备份与恢复 文章目录 1. 物理备份与逻辑备份 2. mysqldump实现逻辑备份 2.1 备份一个数据库 2.2 备份全部数据库 2.3 备份部分数据库 2.4 备份部分表 2.5 ...

  8. 第19章 特殊工具与技术【C++】

    第19章 特殊工具与技术 到此你会感觉C++越来越离谱,不好好想着解决问题,语法与特性先成为了一大问题.只能说太复杂了,上手难度较高. 本章分别从,控制内存分配.运行时类型识别.枚举类型.类成员指针. ...

  9. 第19章 集合框架(3)-Map接口

    第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...

最新文章

  1. CVPR 2017 全部及部分论文解读集锦
  2. 使用SAT研究IBASE hierarchy读取性能
  3. 大数据之Spark教程
  4. android微信第三方登录怎么通过code获取openid?
  5. FFmpeg总结(五)AV系列结构体之AVCodec、AVCodecParameters、AVCodecParser、AVCodecParserContext、AVCodecDescriptor
  6. FRR BGP协议分析11 -- ZEBRA初始化
  7. 整理读研期间用过、改进过、写过的代码
  8. oracle建表唯一约束语句,oracle 详细建表语句
  9. App后台开发运维——架构设计
  10. 三相全桥整流电路_三相桥式全控整流电路的工作原理
  11. 秦曾昌人工智能课程---4、梯度下降算法
  12. 操作系统磁盘调度算法
  13. PXC 避免加入集群时发生SST
  14. MacOS苹果系统下Chrome谷歌浏览器缓存目录
  15. 无需改动代码实现jasypt加密
  16. Markdown添加目录(自定义目录)
  17. vue+springcloud出现跨域问题
  18. 【IAP】STM32和GD32的IAP原理分析、教程、资料整理
  19. 清华大学有色金属产业(CEO)高级工商管理研修班(五期)
  20. docker 版X-pack 6.3.0破解

热门文章

  1. 远程监控系统集成方案
  2. 上传文件到阿里云OSS对象存储,查询访问地址,删除文件
  3. MySQL Replication主主复制—(实例)
  4. 【转载】架构师速成-如何高效编程
  5. uboot常用命令详解 2
  6. 使用php-amqplib连接rabbitMQ 学习笔记及总结
  7. Windows 10 Build 14926发布:Insider旧版本10月15日后无法启动
  8. 链接与加载过程中,几个关键的概念
  9. 【心得】centos 去除屏幕保护
  10. C++Primer第5版学习笔记(三)