在C#2.0中使用Nullable可空类型

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

 

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

 

现在nullC#的一个关键字,它可以被赋给一个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型变量除了可以相互自动转化之外,还可以通过操作符在它们中进行操作。参考下面代码:

ExpandedBlockStart.gif代码
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
Result
abc == 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;如果firstnull,则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,因为ValBnull。这就允许我们利用一个null值将一个变量转变成一个默认值。在上面的代码中,这个默认值为 -1




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

豆瓣9.7,这些舍不得看完的神剧,看一集少一集!我刷了一晚上……

全世界只有3.14 % 的人关注了爆炸吧知识今天给大家介绍一位好朋友——小樱&#xff0c;小樱&#xff0c;作为资深美剧迷英语博主&#xff0c;收藏了很多经典美剧、动画资源&#xff0c;每天还会和大家分享新鲜有趣的英语知识。喜欢看美剧追动画和立志学好英语的小伙伴千万别错过…

C#编码规范

1、连接数据库并返回DataTable View Code public DataTable GetDataByTable() { DataSet dataset new DataSet(); DataTable datatable null; SqlConnection sqlConnection new SqlConnection("Data Source.;Initial CatalogCalamity_Dat…

api中文文档 mws_中英文排版规范化 API

此文章对开放数据接口 API 之「中英文排版规范化 API」进行了功能介绍、使用场景介绍以及调用方法的说明&#xff0c;供用户在使用数据接口时参考之用。 1. 产品功能此次开放了中英文排版规范化在线接口&#xff0c;用于自动中英文排版、标点符号格式化&#xff0c;中英混排格式…

计算机管理无法连接虚拟磁盘服务,虚拟磁盘服务错误怎么操作【图文教程】

虚拟磁盘我们大家都可以看到但实际上是不存在的&#xff0c;虚拟的就是假的。虚拟磁盘是通过将一些网络文件或是内存利用科技手段伪造成磁盘&#xff0c;我们通常称它为虚拟磁盘。虚拟磁盘可以给内存增加容量&#xff0c;可以加快磁盘数据交换&#xff0c;提高计算机运行速度。…

记一次 .NET 某机械臂智能机器人控制系统MRS CPU爆高分析

一&#xff1a;背景 1. 讲故事这是6月中旬一位朋友加wx求助dump的故事&#xff0c;他的程序 cpu爆高➕UI卡死&#xff0c;问如何解决&#xff0c;截图如下&#xff1a;在拿到这个dump后&#xff0c;我发现这是一个关于机械臂的MRS程序&#xff0c;哈哈&#xff0c;在机械臂这种…

linux 信号_Linux中的信号处理机制 [四]

信号与线程Unix的信号机制在诞生之初&#xff0c;生活在只有进程(process)的相对单纯的环境中。自从Unix世界有了线程(thread)的概念&#xff0c;信号就被赋予了发往进程中某个特定线程的能力&#xff0c;当然&#xff0c;这也增加了整个信号机制实现的复杂度。本系列的前面三篇…

HP NIC Teaming技术探讨

NIC Teaming技术将2个或更多个网卡(HP NIC Teaming最多可达8个)捆绑在一起使用&#xff0c;以达到增加总的带宽(Load Balance&#xff0c;负载均衡)或者线路容错(Fault Tolerance)的目的。由2个或多个网卡组成一个逻辑网络端口Teamport&#xff0c;IP地址和网络设置绑定在这个逻…

仙居(一)

仙居&#xff08;一&#xff09; 仙居——仙人居住的地方。 景星岩全景 (看大图请点击) 其他图片在整理中&#xff0c;待我慢慢把图片和故事都理出来。转载于:https://www.cnblogs.com/hzy5901/archive/2011/03/31/5871611.html

我的电脑不联网,很安全!黑客:你还有风扇呢

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;机器之心参与&#xff1a;张倩、蛋酱、杜伟从1988年第一个网络蠕虫病毒诞生以来&#xff0c;「互联网危机四伏」的观念就已经深入人心。如果只是这样&#xff0c;不给电脑联网、禁止使用任何可移动储存介质&#xff0c;数…

移动终端测试进化论

2019独角兽企业重金招聘Python工程师标准>>> 移动终端测试进化论 本案例主要以5年的现身经历&#xff0c;阐述针对移动互联网终端测试&#xff0c;从最基础的原始时代如何进入到现代化时代&#xff1b;从单一到多点密集&#xff1b;从对产品的质量保障进化到对产品信…

计算机视觉领域还有那些坑,深度学习/计算机视觉常见的8个错误总结及避坑指南...

人类并不是完美的&#xff0c;我们经常在编写软件的时候犯错误。有时这些错误很容易找到&#xff1a;你的代码根本不工作&#xff0c;你的应用程序会崩溃。但有些 bug 是隐藏的&#xff0c;很难发现&#xff0c;这使它们更加危险。在处理深度学习问题时&#xff0c;由于某些不确…

MySQL从原理到实践,一篇从头到尾讲清楚

前两天&#xff0c;我跟一个面试官聊天&#xff0c;发现一个普遍现象&#xff0c;不少候选人&#xff0c;对数据库的认知&#xff0c;还处在比较基础的阶段&#xff0c;以为会写“增删改查”、做表关联就足够了&#xff0c;那些工作中经常出现的问题&#xff0c;却支支吾吾答不…

库卡机器人是s7编程_「西门子1200PLC教程」19.S7-1200入门实例

头条号私信回复1&#xff0c;可免费获取海量资源下载链接本文任务&#xff1a;电动机启保停控制练习按下瞬时启动按钮I0.6&#xff0c;电动机Q0.0启动&#xff1b;按下瞬时停止按钮I0.7&#xff0c;电动机Q0.0停止。目录1.组态设备2.编写程序3.下载项目4.监视运行情况1.组态设备…

戴尔新版bios设置中文_戴尔电脑装机过程

戴尔电脑装机过程U盘制作过程&#xff1a;一&#xff1a;启动盘安装 win 101、准备工具&#xff1a;一块空的 8G 以上的 U 盘、一套官网下载的 win 10 操作系统 2、制作启动盘&#xff1a;将下载好的操作系统直接解压到U盘里面就完成了 二&#xff1a;pe 盘安装 win 101、准备工…

云计算

一 云计算 1 定义1&#xff09;新兴的互联网服务&#xff0c;该服务即是由成千上万的超级计算机构成的超强的计算机处理能力。2&#xff09;用户可以通过购买这种服务来满足本地对计算机运算能力需求。3&#xff09;互联网服务商一般会通过与某些需要计算机运算能力的软件的集成…

一组超炫酷的动图,感受那让人窒息的数学之美!

全世界只有3.14 % 的人关注了爆炸吧知识在蒋迅博客上看到的一组图片&#xff0c;转自imgur。本文来源&#xff1a;蒋迅的博客原文连接&#xff1a;http://blog.sciencenet.cn/blog-420554-923731.html

《飞机大战》安卓游戏开发源码(三)

为什么80%的码农都做不了架构师&#xff1f;>>> 本文章属于原创性文章&#xff0c;珍惜他人劳动成果&#xff0c;转载请注明出处&#xff1a;http://www.pm-road.com/index.php/2014/11/06/161/ 前言&#xff1a;最 近闲来无事&#xff0c;而且也是因为刚接触安卓不…

抽屉远离在计算机的应用,抽屉原理的应用及其推广优秀毕业论文

抽屉原理的应用及其推广优秀毕业论文 抽屉原理的应用及其推广 数学与计算机科学学院 数学与应用数学 指导老师&#xff1a; 王美能 摘要&#xff1a;抽屉原理也叫鸽巢原理&#xff0c;是研究如何将元素分类的一个原理&#xff0c;也是组合数学里最简单、最基本的原理。本文简述…

马斯克脑机接口_马斯克的脑机接口,让我倍感担忧

前段时间&#xff0c;特斯拉创始人马斯克展示了一项研究成果——把芯片装在人脑袋里。按照他的说法&#xff0c;植入的芯片不仅不会对人脑造成任何伤害&#xff0c;相反的&#xff0c;可以解决很多神经系统问题&#xff0c;比如注意力不集中、上瘾、焦虑等。不仅如此&#xff0…

kivy中文手册python_K-Meleon

K-Meleon K-Meleon - 一手掌控你的瀏覽體驗 K-Meleon 是一個速度超快、高度自訂、輕量化的網路瀏覽器&#xff0c;採用 Mozilla 開發、用於 Firefox 的 Gecko 佈局引擎。K-Meleon 完全免費、使用 GNU General Public License 授權的開放源碼軟體&#xff0c;專為 Microsoft Win…