用于 ??如果对象不为空,则获取对象的属性

use of ?? to get attributes of an object if the object isn't null

是否可以使用 C# '??'运算符是这样的:

var _var = pr.Value ?? "NA";

检查 pr 是否为 null 而不是 pr 的 Value 属性是否为 null ?

我找不到任何显示类似内容的示例。

如果是,在这种情况下是推荐还是使用扩展方法更好?

To check if pr is null and not if Value attribute of pr is null ?

您似乎只想检查 pr 是否为空。在这种情况下,三元运算符是您的选择:

var _var = pr == null ? "NA" : pr.Value;

或使用简单的 if/else.

这里有 3 种不同的场景,所以让我们来看看每种场景的语法:

  1. Return "NA" 如果 prpr.Value 为空:

    var _var = pr?.Value ?? "NA";
    

    ?. 运算符基本上会说 "if pr is null, return null for the whole expression and do not dereference pr.Value"

    因此,如果 pr 为空,?. 运算符将使表达式计算为空,或者如果 pr.Value 为空,它也将计算为空,并且在这两种情况下情况下,?? "NA" 会将整个事情评估为 "NA"

    这在结果方面等同于:

    string _var;
    if (pr is null || pr.Value is null)
        _var = "NA";
    else
        _var = pr.Value;
    
  2. Return "NA" 如果 pr.Value 为空:

    var _var = pr.Value ?? "NA";
    

    这就是你所拥有的。如果 pr 为空,这将抛出一个 NullReferenceException,但如果 pr 为非空但 pr.Value 为空,则计算为 "NA"

    这在结果方面等同于:

    string _var;
    if (pr.Value is null) // can throw NullReferenceException
        _var = "NA";
    else
         _var = pr.Value;
    
  3. Return "NA" 如果 pr 为空并且...如果 pr.Value 为空怎么办?

    ???. 都不能帮助你,但你可以使用三元运算符:

    var _var = (pr is null)
        ? "NA"
        : pr.Value;
    

    如果 pr 为空,这将计算为 "NA",如果 pr 为非空,则计算为 pr.Value,因此如果 pr 为非空,但 pr.Value 为空。


注意?? 运算符也是延迟计算的,就像三元运算符一样,所以如果你有这个:

var _v = pr?.Value ?? ComputeTheValue();

并且该方法调用很昂贵,只有在 pr?.Value 实际上为空时才会对其进行评估,如果 pr 为非空且 pr.Value 为非空,则调用不会制作。