在C#1.x的版本中,一个值类型变量是不可以被赋予null值的,否则会产生异常。在C#2.0中,微软提供了Nullable类型,允许用它定义包含null值(即空值)的数据类型,这对处理数据库中包含可选字段以及很多方面都有很大帮助。

定义Nullable类型
    定义一个nullable类型非常类似于定义一个非nullable类型。不同之处在于使用类型修饰符“?”。比如定义一个整型如下:
int myInt = 1;要使一个整型变量可以存储一个null值,可以如下声明:
int? myNullableInt = 1;这两个变量看起来似乎是一样的。但事实并非如此。实际上,Nullable类型是一个结构体,它有两个公开可读字段:HasValue和Value。HasValue是一个布尔值,当有值存储时它为真,当变量值为null时HasValue为假。当HavValue为真是时,可以取得变量的值;为假时,当尝试取得变量的值时会抛出一个异常。

现在null是C#的一个关键字,它可以被赋给一个Nullable型变量。下面是对Nullable型变量赋值的两种有效方式。
double? myDouble = 3.14159;

double? myOtherDouble = null;

可以看到,myDouble被赋给一个值,它也可以被赋以null。在第二个语句中,myOtherDouble被初始化为null——在一个非Nullable型变量中这样做会无法通过编译。

使用nullable类型
    一个Nullable型变量可以像一般值类型那样使用。在编译过程中Nullable型变量和非Nullable型变量会进行隐式田转换。就是说我们可以把一个标准整型赋给一个整型Nullable变量,反之亦然。参考下面示例代码:

 int? nFirst = null;
 int Second = 2;
 
 nFirst = Second;// 可以

nFirst = 123;// 可以

Second = nFirst;//编译错误:无法将int?隐式转换成int.
 //应该: Second = nFirst.Value;或 Second = (int)nFirst;

还可以利用Nullable型变量的HasValue属性。

if (nFirst.HasValue) Second = nFirst.value;
如上所示,如果nFirst 含有一个值,这个赋值语句就会运行;否则,就会跳过。

在Nullable值中使用操作符:Lifed Operators【1】
    两个相同类型的Nullable型和非Nullable型变量除了可以相互自动转化之外,还可以通过操作符在它们中进行操作。参考下面代码:

代码

int ValA = 10;
int? ValB = 3;
int? ValC = ValA * ValB;
//ValC==30 int ValA = 10;

int? ValB = null;
int? ValC = ValA * ValB;
//ValC==null int ValA = 10;

int? ValB = null;
int? ValC = ValA + ValB;
//ValC仍然是null;

可以看到,两个操作数只要有任何一个是null,得到的结果也一定是null,不管是加减还是乘除。当然,如果操作数不是null ,则结果还是按原来操作符运算得到的结果。

  在上面的代码中,如果ValC不是Nullable类型,情况会怎么样呢?如以下代码:

 int ValA = 10;
 int? ValB = 3;
 int ValC = ValA * ValB;//编译错误:无法将int?隐式转换成int.

ValA * ValB的结果是null,它不能被赋给一个非Nullable变量ValC。

关系运算
    两个都是null值的Nullable变量被认为是相等的,而一个值为null的变量和其它任何非null值的变量都是不相等的。如下面示例代码:

int abc = 123;
int xyz = 890;

int? def = null;
int? uvw = 123;

Comparison
Resultabc == xyz
// false
abc == def
// false
def == null
// true

abc == uvw
// true
uvw == null
// false
uvw != null
// true

在其它关系运算中,如果其中一个或两个操作数为null,则结果一定是false。如下面示例代码(仍然使用上面定义的变量):

Comparison
Result

abc > uvw
// false, they are equal
abc < def
// false, def is null
uvw < def
// false, because def is null
def > null

// false, because right side is null
uvw > null
// false, because right side is null

移除空值
    C#2.0同时也提供一个新操作符’??’用来合并空值。其语法格式如下:
returnValue = first ?? second;
在这个语句中,如果first为非null,则first的值会被赋给returnValue;如果first为null,则second会被赋给returnValue。注:returnValue可以是Nullable类型也可以是非Nullable类型。 如果要将一个Nullable变量的值赋给一个非Nullable变量,可以用下面方法:
int? ValA= 123;
int? ValB = null;

int NewVarA = ValA ?? -1;
int NewVarB = ValB ?? -1;

上面这段代码运行完以后,NewVarA的值为123,因为ValA的值不是null。而NewVarB值变为 -1,因为ValB为null。这就允许我们利用一个null值将一个变量转变成一个默认值。在上面的代码中,这个默认值为 -1。

在C#2.0中使用Nullable可空类型相关推荐

  1. 在C#2.0中使用Nullable可空类型(转帖)

    在C#2.0中使用Nullable可空类型 在C#1.x的版本中,一个值类型变量是不可以被赋予null值的,否则会产生异常.在C#2.0中,微软提供了Nullable类型,允许用它定义包含null值( ...

  2. java对象数组覆盖_java – 如何覆盖RAML 1.0中的对象数组属性类型

    据了解,Response是抽象不同类型的数据,但格式相似.一种方法是使用resourcesTypes抽象出响应中的相似性,并在类型中定义具体的数据. #%RAML 1.0 title: New API ...

  3. SATA3.0中FIS的八种类型

    1 Register - Host to Device 描述:将映像寄存器内容由主机发送至设备,用于发送命令: 发送: �初始化:c="1"时,写命令寄存器:c="0&q ...

  4. python什么是空类型_在Python中创建真正的空类型

    创建您自己的自定义容器怎么样?在class Empty(object): def __init__(self, **kwargs): object.__setattr__(self, '_obj', ...

  5. c# hdf5 写string_聊一聊C#8.0中的 await foreach

    (给DotNet加星标,提升.Net技能) 转自:码农阿宇 cnblogs.com/CoderAyu/p/10680805.html AsyncStreamsInCShaper 8.0 很开心今天能与 ...

  6. 聊一聊C# 8.0中的await foreach

    很开心今天能与大家一起聊聊C# 8.0中的新特性-Async Streams,一般人通常看到这个词表情是这样. 简单说,其实就是C# 8.0中支持await foreach. 或者说,C# 8.0中支 ...

  7. 分析 C# 2.0 新特性 -- 空类型(Nullable Types)

    分析 C# 2.0 新特性  -- 空类型(Nullable Types) 在讨论C# 2.0 空类型前,先回顾一下.NET 1.0和.NET 1.1对于类型有下面这样的定义: ".NET  ...

  8. 在Teams app代码中enable nullable

    昨天讲了一下如何把代码升级到 net6,今天我优化了好几个小时更新代码,enable了nullable. c#的nullable我一直非常喜欢,它可以帮助开发人员,让开发人员去思考,哪些地方需要可以为 ...

  9. C#2.0中的泛型学

    之前对于泛型一直没有个系统的学习,只是懂得如何调用而已,今天就结合MSDN和网上的一些文章对C#2.0的泛型进行深入研究. 1. 概述 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的 ...

最新文章

  1. 近期活动盘点:数据科学研究院论坛“人文社科专场、全球最大的免费编程社区公开课、DeeCamp2019:实战AI 铸造定雨神针...
  2. CentOS7下Docker Storage Pool扩容
  3. debug —— list调试命令
  4. PHP版本的自动生成有规则的订单号(或编号)
  5. boost::geometry::index::detail::union_content用法的测试程序
  6. VR與AI的激情相遇
  7. 自己构建GlassFish 4.0快照
  8. python6清空屏幕,python:文件的读取、创建、追加、删除、清空
  9. 通过cordova将vue项目打包成app
  10. 软著申请流程与方法详解
  11. 如何拯救k8s镜像分发的阿喀琉斯之踵
  12. 阿里巴巴达摩院视觉AI平台概述
  13. Android蓝牙音乐(基于Android10)
  14. work bench 建表时PK/NN/ UQ等的含义
  15. backtrader FAQ:什么是一篮子订单Bracket Orders optMaster
  16. 利用MATLAB命令求解运输问题
  17. javascript实现鼠标移动两个小人的动画效果
  18. chrome浏览器的下载地址
  19. 前端get,post、pul、deletec请求方式相关传参总结
  20. FPGA串口多字节接收、解码和仿真

热门文章

  1. 2012年1月份第2周51Aspx源码发布详情
  2. ASP.NET跨页传值方法汇总
  3. html form src,form.html
  4. 后端技术:JDK 8 Stream 数据流效率测试
  5. JS 中 call()、apply()、bind() 的用法
  6. ASP.NET MVC中常用的ActionResult类型
  7. php动态添加查询,php动态添加url查询参数的方法,php动态url参数_PHP教程
  8. php获取服务器名称,PHP 获取服务器详细信息
  9. 物理机存放mysql实例原则_MySQL优化笔记(四)--表的设计与优化(单表、多表)...
  10. 能让你少写1000行代码的20个正则表达式