这种情况意味着什么?
if (!helper?.Settings.HasConfig ?? false)
P.S。
helper
是某个类的变量Settings
是某个字段HasConfig
也是字段答案 0 :(得分:14)
好吧,?.
是 null-conditional 运算符
https://msdn.microsoft.com/en-us/library/dn986595.aspx
X?.Y
表示如果null
为空,则返回x
,否则返回x.y
??
是 null-coalescing operator
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)))
答案 1 :(得分:6)
x?.y - null条件成员访问。如果左手操作数为空,则返回null。
x ?? y - 如果非空,则返回x;否则,返回y。
如果helper?.Settings
为空,helper
将返回null,否则将返回helper.Settings
如果helper.Settings
不为空并且helper.Settings.HasConfig
不为null,则它将返回helper.Settings.HasConfig
的值,否则将返回false。
N.B:如果helper?.Settings
为null,则会发生NULL引用异常。
答案 2 :(得分:4)
?.
运算符称为C#6中引入的safe navigation operator
。
空条件运算符语法
空条件运算符(?。)通俗地称为"Elvis operator"
,因为它与大量头发下的一双黑眼睛相似。 null条件是成员访问运算符(。)的一种形式。以下是空条件运算符的简化说明:
如果左操作数(A)为非空,则表达式A?.B
的计算结果为B
;否则,它会评估音调。
更多细节完全定义了行为:
在B为的情况下,表达式A?.B的类型是B的类型 参考类型。如果B是值类型,则表达式A?.B是 包含由B表示的基础值类型的可空类型。
该功能的规格要求A不进行评估 不止一次。
空条件运算符短路,这意味着你 可以链接多个。操作符,知道第一个null 遇到了阻止的剩余(最右边)组件 被评估的表达。
示例: - 假设我们有一个Student class
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
为null,则name为null。如果s
不为null,则name为s.FirstName
的值。请注意,即使s.FirstName
不是s
,int?
也可能为空。
变量age是s
(这是指定Nullable的另一种方式)。与名称一样,年龄值取决于null
的值。如果s是int?
,则年龄为s.Age
且没有值。如果s为非null,则age为N
的包装值。
这是基础知识。此功能的强大功能来自此功能可以实现更清晰代码的所有场景。
答案 3 :(得分:1)
它会检查"帮助"在进行访问之前不是NULL"设置"属性以避免NullReferenceException。 https://msdn.microsoft.com/en-us/library/dn986595.aspx "旧"方式是这样的:if(helper!= null&&!helper.Settings ......)。