在C#2.0中使用Nullable可空类型
在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 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? 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? 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可空类型相关推荐
- 在C#2.0中使用Nullable可空类型(转帖)
在C#2.0中使用Nullable可空类型 在C#1.x的版本中,一个值类型变量是不可以被赋予null值的,否则会产生异常.在C#2.0中,微软提供了Nullable类型,允许用它定义包含null值( ...
- java对象数组覆盖_java – 如何覆盖RAML 1.0中的对象数组属性类型
据了解,Response是抽象不同类型的数据,但格式相似.一种方法是使用resourcesTypes抽象出响应中的相似性,并在类型中定义具体的数据. #%RAML 1.0 title: New API ...
- SATA3.0中FIS的八种类型
1 Register - Host to Device 描述:将映像寄存器内容由主机发送至设备,用于发送命令: 发送: �初始化:c="1"时,写命令寄存器:c="0&q ...
- python什么是空类型_在Python中创建真正的空类型
创建您自己的自定义容器怎么样?在class Empty(object): def __init__(self, **kwargs): object.__setattr__(self, '_obj', ...
- c# hdf5 写string_聊一聊C#8.0中的 await foreach
(给DotNet加星标,提升.Net技能) 转自:码农阿宇 cnblogs.com/CoderAyu/p/10680805.html AsyncStreamsInCShaper 8.0 很开心今天能与 ...
- 聊一聊C# 8.0中的await foreach
很开心今天能与大家一起聊聊C# 8.0中的新特性-Async Streams,一般人通常看到这个词表情是这样. 简单说,其实就是C# 8.0中支持await foreach. 或者说,C# 8.0中支 ...
- 分析 C# 2.0 新特性 -- 空类型(Nullable Types)
分析 C# 2.0 新特性 -- 空类型(Nullable Types) 在讨论C# 2.0 空类型前,先回顾一下.NET 1.0和.NET 1.1对于类型有下面这样的定义: ".NET ...
- 在Teams app代码中enable nullable
昨天讲了一下如何把代码升级到 net6,今天我优化了好几个小时更新代码,enable了nullable. c#的nullable我一直非常喜欢,它可以帮助开发人员,让开发人员去思考,哪些地方需要可以为 ...
- C#2.0中的泛型学
之前对于泛型一直没有个系统的学习,只是懂得如何调用而已,今天就结合MSDN和网上的一些文章对C#2.0的泛型进行深入研究. 1. 概述 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的 ...
最新文章
- 近期活动盘点:数据科学研究院论坛“人文社科专场、全球最大的免费编程社区公开课、DeeCamp2019:实战AI 铸造定雨神针...
- CentOS7下Docker Storage Pool扩容
- debug —— list调试命令
- PHP版本的自动生成有规则的订单号(或编号)
- boost::geometry::index::detail::union_content用法的测试程序
- VR與AI的激情相遇
- 自己构建GlassFish 4.0快照
- python6清空屏幕,python:文件的读取、创建、追加、删除、清空
- 通过cordova将vue项目打包成app
- 软著申请流程与方法详解
- 如何拯救k8s镜像分发的阿喀琉斯之踵
- 阿里巴巴达摩院视觉AI平台概述
- Android蓝牙音乐(基于Android10)
- work bench 建表时PK/NN/ UQ等的含义
- backtrader FAQ:什么是一篮子订单Bracket Orders optMaster
- 利用MATLAB命令求解运输问题
- javascript实现鼠标移动两个小人的动画效果
- chrome浏览器的下载地址
- 前端get,post、pul、deletec请求方式相关传参总结
- FPGA串口多字节接收、解码和仿真
热门文章
- 2012年1月份第2周51Aspx源码发布详情
- ASP.NET跨页传值方法汇总
- html form src,form.html
- 后端技术:JDK 8 Stream 数据流效率测试
- JS 中 call()、apply()、bind() 的用法
- ASP.NET MVC中常用的ActionResult类型
- php动态添加查询,php动态添加url查询参数的方法,php动态url参数_PHP教程
- php获取服务器名称,PHP 获取服务器详细信息
- 物理机存放mysql实例原则_MySQL优化笔记(四)--表的设计与优化(单表、多表)...
- 能让你少写1000行代码的20个正则表达式