【问题标题】:What does mean "?" after variable in C#?这是什么意思 ”?”在 C# 中的变量之后?
【发布时间】:2016-10-17 12:56:00
【问题描述】:

这个条件是什么意思?

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

附言

  • helper 是一些 class 的变量
  • Settings 是一些字段
  • HasConfig 也是字段

【问题讨论】:

    标签: c# c#-4.0 operators


    【解决方案1】:

    嗯,?. 是一个 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))) 
    

    【讨论】:

      【解决方案2】:

      查看C# operator list

      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 为空,则会发生空引用异常。

      【讨论】:

        【解决方案3】:

        ?. 运算符被称为 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 的包装值。

        这就是基础。此功能的强大之处在于此功能可以实现更简洁的代码的所有场景。

        【讨论】:

          【解决方案4】:

          它会在访问“设置”属性之前检查“助手”是否不为 NULL,以避免出现 NullReferenceException。 https://msdn.microsoft.com/en-us/library/dn986595.aspx “旧”方式是这样的:if (helper != null && !helper.Settings......)。

          【讨论】:

            猜你喜欢
            • 2011-08-30
            • 2021-11-25
            • 2012-07-20
            • 2021-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-09
            • 1970-01-01
            相关资源
            最近更新 更多