什么意思"?"在C#变量之后?

时间:2016-06-16 06:54:33

标签: c#-4.0 operators

这种情况意味着什么?

if (!helper?.Settings.HasConfig ?? false)

P.S。

  • helper是某个类的变量
  • Settings是某个字段
  • HasConfig也是字段

4 个答案:

答案 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)

检查C# operator list

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不是sint?也可能为空。

变量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 ......)。