在引入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. Java学习笔记(6)

    superclass(base class)和subclass 扩展一个类的语法 public class subClassName extends superClassName 子类中通过super ...

  2. python基础—字典的使用{}

    info = {'stu1':"lili", 'stu2':'yoyo', 'stu3':'dudu'}print(info)print(info['stu1'])info['st ...

  3. TensorFlow,Keras限制GPU显存

    运行TensorFlow程序会占用过多的显卡比例,多人共同使用GPU的时候,会造成后面的人无法运行程序. 一.TensorFlow 1.预加载比例限制 tf_config = tensorflow.C ...

  4. 使用delimiter //,解决mysql end报错问题

    这是我的初始报错的代码: )) begin select sc.* from sc where sno= student_no end; 会报这个错误,“Error Code: 1064. You h ...

  5. 如何使用python在保留原excel格式的前提下插入/修改数据

    一.需求分析: 统计的报表中需要每日查询当天数据并追加到原有的excel后面. 因为原始excel格式已经设定好,如果使用xlwt,仅仅指定设定我们要插入的单元格的格式,原始数据的格式会被初始化. 所 ...

  6. 将连接数据库的JDBC提成BaseDao

    package com.shangke; import java.io.FileReader;import java.io.IOException;import java.io.InputStream ...

  7. What is the Annotation?

    Annotation称为注释或注解,它是一个接口.注解提供了一种为程序元素(类.方法.成员变量等)设置元数据(描述其它数据的数据)的方法.编译器.开发工具或其它程序中可以通过反射来获取程序中的Anno ...

  8. Thread.yield( )通俗理解

    一. Thread.yield( )方法: 使当前线程从执行状态(运行状态)变为可执行态(就绪状态).cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不 ...

  9. C# - 匿名对象属性的赋值与取值

    在new出匿名对象的函数内可以直接调用该匿名对象的属性取值. 可是在其它函数就无法调用匿名对象的属性或方法. 这时,我们可以通过c#的反射机制取值: 文章出处:https://www.cnblogs. ...

  10. 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165308 张士洋

    2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 20165308 张士洋 1.进入官网下载Kali Linux VirtualBox版本的镜像文件. 2.解压并 ...