设为首页 加入收藏

TOP

C#可空类型
2015-03-04 22:51:16 来源: 作者: 【 】 浏览:40
Tags:类型

在程序开发中,有时候需要值类型也为可空类型,比如,在数据库中,我们可以把一个日期Datetime设置为null。


在C# 2.0中就出现了可空类型,允许值类型也可以为空(null),可空类型的实现基于C#泛型。


可空类型的核心是System.Nullable,同时静态类System.Nullable为可空类型提供了很多实用的方法。下面分别看看可空类型的这两个重要组成部分。


通过ILSpy我们可以查看这个类型的C#代码:



从上面的图中可以看到关于System.Nullable的一些关键点:


对于任何具体的可空类型来说,T的类型为可空类型的基础类型(underlying type),例如Nullable的基础类型就是int。


通过上面代码还可以看到,Nullable有两个重要的属性,HasValue和Value。通过它们可以了解可空类型是怎么工作的:


下面看一个可空类型的简单例子,进一步了解一下可空类型:


程序的输出为:



通过这段代码可以看到HasValue和Value的使用,以及Nullable中一些常用的方法。


注意,在这段代码中,下面两句的IL代码是一样的:


C#代码


IL代码


这里涉及了包装(wrapping)拆包(unwrapping)的概念:将T的一个实例转换成Nullable的一个实例的过程在C#中成为包装,相反的过程成为拆包。这个概念跟装箱和拆箱不一样,后面会看到Nullable的装箱和拆箱。


从前面的分析可以看到Nullable是一个结构,也就是一个值类型。也就是说,当我们把可空类型转换成一个引用类型的时候需要进行装箱操作。


对于Nullable的装箱和拆箱可以概括为:


看一个关于可空类型装箱和拆箱的例子:


输出:



System.Nullable是一个静态类,只包含三个静态方法,大家可以通过ILSpy进行查看,这里就不上图了。


下面两个方法是比较方法:


下面这个方法用来获得可空类型的基础类型:


在C# 2.0中,我们可以使用?修饰符来表示可空类型。


下面的C#语句具有相同的IL代码。


C#编译器允许使用null在比较和赋值中表示一个可空类型的空值。


对于下面的代码,通过IL可以发现"x == null"实际调用的是HasValue属性进行比较。


C# 2.0中出现的可空类型解决了我们很多的问题,可空类型的相关知识还是比较容易理解的。


在使用中,我们可以直接使用?修饰符来创建可空值类型。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C#方法组转换和匿名方法 下一篇C#基本知识点-Readonly和Const的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: