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

Plu*_*ell 10 c# operators c#-4.0

这个条件是什么意思?

if (!helper?.Settings.HasConfig ?? false)
Run Code Online (Sandbox Code Playgroud)

PS

  • helper 是某类的变量
  • Settings 是一些领域
  • HasConfig 也是场

Dmi*_*nko 18

好吧,?.是一个空条件运算符

https://msdn.microsoft.com/en-us/library/dn986595.aspx

X?.Y

表示返回nullif x为null和x.y否则

??是一个null-coalescing运算符

https://msdn.microsoft.com/en-us/library/ms173224.aspx

x?.y
Run Code Online (Sandbox Code Playgroud)

表示是否x == null返回y,否则x

结合以上所有

x ?? y
Run Code Online (Sandbox Code Playgroud)

意思是:false如果返回

helper?.Settings.HasConfig ?? false
Run Code Online (Sandbox Code Playgroud)

否则返回

helper == null or
helper.Settings.HasConfig == null
Run Code Online (Sandbox Code Playgroud)

没有代码???. if可以改写成繁琐

helper.Settings.HasConfig
Run Code Online (Sandbox Code Playgroud)


fay*_*rmd 6

检查C#运算符列表:

x?.y - null条件成员访问.如果左侧操作数为null,则返回null.

X ??y - 如果非空,则返回x; 否则,返回y.

因此,helper?.Settings如果helper为null则返回null,否则返回nullhelper.Settings

if helper.Settings不为null helper.Settings.HasConfig且不为null然后它将返回值helper.Settings.HasConfig否则将返回false.

注意:如果helper?.Settings为null,则会发生NULL引用异常.


小智 6

?.运算符被称为safe navigation operatorC# 6 中引入的 Null 条件运算符语法

空条件运算符 (?.) 通俗地称为 the,"Elvis operator"因为它类似于一缕头发下的一双黑眼睛。null 条件是成员访问运算符(.)的一种形式。以下是 null 条件运算符的简化说明:

如果左操作数 (A) 不为空,则表达式的A?.B计算结果为;B否则,它的计算结果为 null。

更多细节完全定义了行为:

  • 在 B 是引用类型的情况下,表达式 A?.B 的类型是 B 的类型。如果 B 是值类型,则表达式 A?.B 是包装 B 表示的基础值类型的可为空类型。

  • 该功能的规范要求 A 的评估不得
    超过一次。

  • null 条件运算符短路,这意味着您
    可以链接多个 ?. 运算符,因为知道遇到的第一个 null会阻止 计算表达式
    的其余(最右边)组件。

示例:- 假设我们有一个 Student 类

public class Student
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

假设 s 代表一名学生。考虑以下两个陈述:

var name = s?.FirstName;
var age = s?.Age;
Run Code Online (Sandbox Code Playgroud)

变量名称是一个字符串。name 的值取决于 的值s。如果s为空,则名称为空。如果s不为 null,则 name 为 的值s.FirstName。请注意,s.FirstName即使当s不是,也可能为空。

变量age是一个int?(这是指定Nullable的另一种方式)。与 name 一样,age 的值取决于 的值s。如果 s 是null,则年龄是int?没有值的。如果 s 非空,则 Age 是 的包装值s.Age

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