【发布时间】:2016-10-17 12:56:00
【问题描述】:
这个条件是什么意思?
if (!helper?.Settings.HasConfig ?? false)
附言
-
helper是一些class的变量 -
Settings是一些字段 -
HasConfig也是字段
【问题讨论】:
这个条件是什么意思?
if (!helper?.Settings.HasConfig ?? false)
附言
helper 是一些 class 的变量
Settings 是一些字段
HasConfig 也是字段
【问题讨论】:
嗯,?. 是一个 null-conditional 运算符
https://msdn.microsoft.com/en-us/library/dn986595.aspx
x?.y
如果x为空则返回null,否则返回x.y
?? 是 空合并运算符
https://msdn.microsoft.com/en-us/library/ms173224.aspx
x ?? y
表示如果x == null返回y,否则x
结合以上所有
helper?.Settings.HasConfig ?? false
表示:如果返回false
helper == null or
helper.Settings.HasConfig == null
否则返回
helper.Settings.HasConfig
没有??和?.if的代码可以改写成麻烦
if (!(helper == null
? false
: (helper.Settings.HasConfig == null
? false
: helper.Settings.HasConfig)))
【讨论】:
x?.y – 空条件成员访问。如果左侧操作数为 null,则返回 null。
x ?? y – 如果 x 不为 null,则返回 x;否则,返回 y。
所以如果helper 为空,helper?.Settings 将返回空,否则返回helper.Settings
如果helper.Settings 不为空且helper.Settings.HasConfig 不为空,则返回helper.Settings.HasConfig 的值,否则返回false。
注意:如果helper?.Settings 为空,则会发生空引用异常。
【讨论】:
?. 运算符被称为 C# 6 中引入的safe navigation operator。
空条件运算符语法
空条件运算符 (?.) 通俗地称为"Elvis operator",因为它类似于一头大卷发下的一对黑眼睛。 null 条件是成员访问运算符(.)的一种形式。下面是对空条件运算符的简单解释:
如果左操作数 (A) 不为空,则表达式 A?.B 的计算结果为 B;否则,它的计算结果为 null。
更多细节完全定义了行为:
表达式 A?.B 的类型是 B 的类型,如果 B 是 一个引用类型。如果 B 是值类型,则表达式 A?.B 是 包装由 B 表示的基础值类型的可空类型。
功能规范要求不评估 A
不止一次。
空条件运算符短路,这意味着您
可以链接多个 ?.operators,知道第一个 null
遇到阻止
的剩余(最右边)组件
表达式被评估。
示例:- 假设我们有一个 Student 类
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
假设 s 代表一个学生。考虑以下两个陈述:
var name = s?.FirstName;
var age = s?.Age;
变量名是一个字符串。 name 的值取决于s 的值。如果s 为空,则名称为空。如果s 不为空,则名称为s.FirstName 的值。请注意,即使s 不是,s.FirstName 也可能为 null。
变量age 是int?(这是指定Nullable 的另一种方式)。与 name 一样,age 的值取决于 s 的值。如果 s 是 null,则 age 是一个没有值的 int?。如果 s 不为 null,则 age 是 s.Age 的包装值。
这就是基础。此功能的强大之处在于此功能可以实现更简洁的代码的所有场景。
【讨论】:
它会在访问“设置”属性之前检查“助手”是否不为 NULL,以避免出现 NullReferenceException。 https://msdn.microsoft.com/en-us/library/dn986595.aspx “旧”方式是这样的:if (helper != null && !helper.Settings......)。
【讨论】: