可空值类型,正如字面意义上的,是可以为NULL的值类型。

这个东西存在的意义可以解决比如数据库的的Int可以为NUll的情况,使得处理数据库数据更简单。

实际上可空值类型就是Nullable<T>这个泛型值类型,而C#有一种更简单的语法糖是int?这种用法:

Nullable<Int32> 数据库类型 = null;
float? 可以为空的浮点类型 = null;
DateTime? 更多的值类型 = null;

可空值类型的更多玩法

在大多数时候用C#去操作可空值类型,完全可以把它当做一个没有?的值类型去处理。

以下是一些玩法示例:

        Int32? 可空类型 = ;//值类型可隐式转换为可空类型
int 值类型 = (Int32)可空类型;//可空类型可以强制转换为值类型
//当然你也可以用下面这两种玩法将可控类型转换为值类型
值类型 = 可空类型.Value;//这种玩法一般是可以的,但是当可空类型值为null时会抛异常
值类型 = 可空类型.GetValueOrDefault();// 如果不为空就获取可空类型的value,为null则为指定的数字123,不指定参数也行,那会返回值类型的默认值。
//值类型也可用于操作符
可空类型++;//对于一元操作符,可空类型值为null则结果为null,不为null则结果和一般值类型一样
可空类型= 可空类型+ 值类型;//对于二元操作符,两个操作数之间有一个为null结果就为null,如果都不为null结果和一般值类型一样
//有一种特殊情况就是&和|应用于Boolean?操作数的时候。
//对于 &操作,只要有一个为false那么结果为false,都没有false那么有null就为null,最后一种情况为true
//对于|操作,只要有一个为true那么结果为true,都没有true那么有null就为null,最后一种情况为false

注意操作可空类型实例会生成大量代码,即使只是一个简单的a+b也会有很多代码。

当你用这个东西的时候,可以想象会先去new Nullable<T>的实例,且进行操作之前都会去判断是否为null,判断成功再去操作实例的value。所以它的速度相对于正常的值类型来讲肯定会慢一点。

C#的空接合操作符 

即??操作符。如果??左边的操作数不为null,那么就返回这个数,否则就返回右边的操作数。

对于可空值类型而言,这个效果和前面的GetValueOrDefault()并指定参数的效果一样。

然而它不仅仅只是用于可空值类型,还可以用于引用类型。

值类型 = 可空类型 ?? ;
String 引用类型 = GetSomeString() ?? "Troy说:这是一个空文本";

CLR中可空值类型的装箱与拆箱

前面讲到可空值类型其实还是值类型,所以依然存在装箱和拆箱的问题。

然而CLR对可空值的装箱和拆箱执行了一些特殊代码:

可空值类型装箱会先去判断是否为null,为null就直接传null给引用类型,无需装箱。不为null就取它的value,再对这个value进行装箱。

可空值类型拆箱也很简单,如果引用类型为null就直接赋值为null,否则按照正常拆箱逻辑走。

CLR的对于可空值类型的一些特殊处理

可空值类型用GetType返回的是其value的类型而不是实际的类型。因为实际上我们这么玩的时候想得到的当然是value的类型,而不是Nullable<T>类型。所以CLR这里做了这个处理。

Console.WriteLine(可空类型.GetType());//返回的是System.Int32,而不是System.Nullable<Int32>

通过可空值类型调用接口方法

public struct Nullable<T> where T : struct

以上是Nullable<T>的定义,可以看到它并没有继承什么接口。

但是它却可以调用值类型T实现的接口方法:

Int32 result = ((IComparable)可空类型).CompareTo();//允许的做法,相当于下面这种玩法,只是说CLR在这方面做了简化处理
result = ((IComparable)(Int32)可空类型).CompareTo();

【C#进阶系列】19 可空值类型的更多相关文章

  1. [CLR via C#]19. 可空值类型

    我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...

  2. 【C#进阶系列】15 枚举类型和位标志

    实际上本章就只讲枚举类型,因为位标志本来就可以当做一个特殊的枚举类型. 关于枚举类型 枚举类型是一种消灭魔法数字的好方法,使程序更容易编写,阅读和维护. 枚举类型是值类型,然而有别于其它值类型,枚举类 ...

  3. C#进阶系列 ---- 《CLR via C#》

      [C#进阶系列]30 学习总结 [C#进阶系列]29 混合线程同步构造 [C#进阶系列]28 基元线程同步构造 [C#进阶系列]27 I/O限制的异步操作 [C#进阶系列]26 计算限制的异步操作 ...

  4. C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解  ...

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

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

  6. [转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T c ...

  7. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  8. Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图

    Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图 OSM(OpenStreetMap-开放街道地图)服务就是一种发布自己地图数据图片为服务的一种实现类型,开放街道 ...

  9. C#进阶系列——WebApi 接口参数不再困惑:传参详解

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

随机推荐

  1. 虚拟化平台cloudstack(3)——安装(下)

    登录时用户名和密码错误 默认账号密码 admin/password 管理节点安装好后,初始化数据库,完了使用admin和password登陆提示用户名密码错误,查看日志: Fail to genera ...

  2. 判断当前日期是否在[startDate, endDate]区间

    /** * 判断当前日期是否在[startDate, endDate]区间 * * @param startDate 开始日期 * @param endDate 结束日期 * @author jqli ...

  3. MYSQL-用户操作

    说明:本文主要写了,MYSQL对于用户的一些操作,有:查看用户,创建用户,权限的赋予,收回,用户的密码修改和删除. MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在U ...

  4. IOS 手势-轻点、触摸、手势、事件

    1.概念 手势是从你用一个或多个手指接触屏幕时开始,直到手指离开屏幕为止所发生的所有事件.无论手势持续多长时间,只要一个或多个手指仍在屏幕上,这个手势就存在. 触摸是指把手指放到IOS设备的屏幕上,从 ...

  5. EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~终结~配置的优化和事务里读写的统一

    回到目录 本讲是通过DbCommand拦截器来实现读写分离的最后一讲,对之前几篇文章做了一个优化,无论是程序可读性还是实用性上都有一个提升,在配置信息这块,去除了字符串方式的拼接,取而代之的是sect ...

  6. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  7. Atitit 发帖机系列(8)  词法分析器v5 版本新特性说明)

    Atitit 发帖机系列(8)  词法分析器v5 版本新特性说明) v5  增加对sql单引号的内部支持.可以作为string 结构调整,使用递归法重构循环发..放弃循环发. V4 java dsl词 ...

  8. SpringBoot常用配置简介

    SpringBoot常用配置简介 1. SpringBoot中几个常用的配置的简单介绍 一个简单的Spring.factories # Bootstrap components org.springf ...

  9. 快速入门系列--MVC--01概述

    虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...

  10. CSS3妙用

    scaleX的妙用 案例1 效果: HTML: <a href="javascript:;">我有下划线噢</a> CSS: a{ text-decorat ...