博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第19章 可空值类型
阅读量:5975 次
发布时间:2019-06-20

本文共 1913 字,大约阅读时间需要 6 分钟。

为什么会有可空值类型:

当我们设计一个数据库时,可将一个数据库字段的数据类型定义成一个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
where T : struct

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

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

你可能感兴趣的文章
redis.conf 配置档详解
查看>>
Windows App开发之集合控件与数据绑定
查看>>
五分钟创建一个自己的NPM包
查看>>
iOS多线程编程:线程同步总结 NSCondtion
查看>>
Flutter开发环境安装
查看>>
QQ登录的那些坑(如何开发qq登陆功能)
查看>>
中大型网站技术架构演变过程
查看>>
深入剖析OkHttp系列(五) 来自官方的事件机制
查看>>
Java 9 CompletableFuture 进化小脚步
查看>>
【前端词典】进阶必备的网络基础(下)
查看>>
ARTS训练第三周
查看>>
12月21日云栖精选夜读:阿里云总裁胡晓明:AI泡沫过后,下一站是“产业AI”...
查看>>
一出好戏不止是部电影,它也正接近你的生活。
查看>>
Angular 表单验证类库 ngx-validator 1.0 正式发布
查看>>
刨根问底——Handler
查看>>
H5活动刮刮卡功能的实现与注意事项
查看>>
搞定Go单元测试(三)—— 断言(testify)
查看>>
web前端—面试2
查看>>
设计模式之 - 简单工厂模式
查看>>
前端如何搭建一个成熟的脚手架
查看>>