在引入nameof操作符的同时,C# 6.0 还引入了Null-Conditional操作符。它使开发者可以检查object引用链中的null值。这个null-conditional 操作符写作"?.",会在引用链中任一个为null时返回null。这避免了对每一级进行null检查。

假设我们有一个class为Student,它有一个属性Address,同时这个属性的type是一个名为Address的Class。现在我们用下面的代码块来print它的HomeAddress。

if (student != null && student.Address != null)
{
WriteLine(student.Address.HomeAddress);
}
else
{
WriteLine("No Home Address");
}

我们可以看到,为了避免null-reference exception,我们不得不检查student是否为null,然后检查student.Address是否为null。

现在,上面的代码会通过使用null-conditional(?.)操作符来重写成:

WriteLine(student?.Address?.HomeAddress ?? "No Home Address");

是不是很帅?不必分别检查每个对象,使用“?.”我们可以同时检查整个引用链。任意一级为null,它都会返回null。下面的图片解释了“?.”是怎么工作的。

它也可以和方法协同工作,特别是当我们trigger event的时候。比如下面的代码

if (AddressChanged != null)
{
AddressChanged (this, EventArgs.Empty);
}

使用?.我们可以这样写。

AddressChanged ?.Invoke(this, EventArgs.Empty)

C# 6.0:Null – Conditional 操作符的更多相关文章

  1. NULL合并操作符??

    参考官方手册: /** * NULL合并操作符 ?? */ // $a, $b, $c都未声明和定义 var_dump($a??$b??$c); // NULL // $a为数组,$b为100,$c为 ...

  2. php中0," ",null和false的区别

    php中很多还不懂php中0,"",null和false之间的区别,这些区别有时会影响到数据判断的正确性和安全性,给程序的测试运行造成很多麻烦.先看一个例子: <? $str ...

  3. 0,null,empty,空,false,isset

    <?php header("Content-type: text/html; charset=utf-8"); $a=0; //1. if($a==0) { echo $a; ...

  4. '0','\0',NULL,EOF的区别

    要看是不是一个东西,打印一下即可 printf("%d %d %d %d\n",'0','\0',NULL,EOF); 输出: 48 0 0 -1 结论: '\0'与NULL 都是 ...

  5. 0,null,undefined,[],{},'',false之间的关系

    0与一些虚值的比较: 0与false 0==false true 0与'': =='' true 0与[]: ==[] true 0与NaN: 0==NaN false 0与undefined 0== ...

  6. myBatis-plus异常提示For input string: "{0=null}"

    异常信息 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Per ...

  7. php 0,null,empty,空,false,字符串关系(转)

    在php中由于是弱类型语言,不同类型值之间可以隐式转换,使得false,null,”,0,’0′这几个值的比较有些混乱,现总结一下: //相等判断 '' == NULL == 0 == false ( ...

  8. 0,'0','\0',NULL的区别

    0,'0','\0',NULL的区别 1,0是一个值,可以是char ,int ,float,double等类型: 2,'0'是一个字符(char)类型,它的ASCII码值是48: 3,'\0'也是一 ...

  9. 空指针/0/NULL

    空指针/0/NULL 空指针是一个被赋值为0的指针,在没有被具体初始化之前,其值为0. NULL 是一个标准规定的宏定义,用来表示空指针常量. #define NULL 0   或者 #define ...

随机推荐

  1. 怎么样通过php使用html5实现多文件上传?(php多图上传)

    <!DOCTYPE html><html lang="zh-cn"> <head> <meta charset="utf-8&q ...

  2. Sublime Text 3(3207)安装

    Sublime Text 3207 下载 官网地址: Sublime Text 下载需要的类型 安装插件 安装插件管理器: 打开Sublime,点击Tools => Install Packag ...

  3. 模块四-shutil模块

    shutil模块 高级的文件处理模块 主要是文件的处理,移动,压缩和解压缩 shutil模块的使用方法: shutil.copyfile()#拷贝文件 shutil.copy()#拷贝文件和权限 sh ...

  4. windows下postgreSQL安装与启动

    转:https://www.yiibai.com/postgresql/install-postgresql.html https://blog.csdn.net/irainreally/articl ...

  5. ArrayList、LinkedList和vector的区别

    1.ArrayList和Vector都是数组存储,插入数据涉及到数组元素移动等操作,所以比较慢,因为有下标,所以查找起来非常的快. LinkedList是双向链表存储,插入时只需要记录本项的前后项,查 ...

  6. Notepad++的实用技巧

    一. 安装notepad + +  notepad++的下载.安装非常easy.下一步下一步,所有选项都默认就可以安装好.但有几点需要注意.   截止到写这篇博文,notepad++的最新版本为7.5 ...

  7. asp。net内置委托

    Action与Func是APS.NET内置委托 //--------------无返回值的委托Action--------------------------- Action是无返回值的泛型委托 Ac ...

  8. ckeditor_配置 修改工具栏段落的标签和在文中的格式

    在默认的工具栏中自带一个格式的选项,可以编辑文字的段落属性,将文字转换为标题.ckeditor中提供了方法可以对这个标签进行修改. 正在做的项目中不叫标题1标题2,叫章.节.条... . 需要进行配置 ...

  9. DateGridView控件与mysql交互

    private void dgv() { //Ip+端口+数据库名+用户名+密码 string connectStr = "server=127.0.0.1;port=3306;databa ...

  10. 改变highCharts的X轴和Y轴的数据刻度

    xAxis:{ tickPixelInterval:10 //自行调整X轴刻度的间距}, yAxis:{ lineWidth:1, //Y轴默认不显示Y轴线,添加一个轴线的宽度就可以显示出来 tick ...