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

时间:2018-11-23 09:23:55

标签: c# operators isnull

是否可以使用C#'??'运算符如下:

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

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

我找不到任何显示类似这样的例子。

如果是,在这种情况下是否建议使用扩展方法?

2 个答案:

答案 0 :(得分:4)

这里有3种不同的情况,因此让我们仔细研究每种情况的语法:

  1. 如果 "NA"pr为空,则返回pr.Value

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

    ?.运算符基本上会说:“如果pr为null,则为整个表达式返回null,并且不取消引用pr.Value

    因此,如果pr为null,则?.运算符将使表达式的结果为null,或者,如果pr.Value为null,则它的结果也将为null,在两种情况下, ?? "NA"会将整个项目评估为"NA"

    在结果上等效于此:

    string _var;
    if (pr is null || pr.Value is null)
        _var = "NA";
    else
        _var = pr.Value;
    
  2. 如果"NA"为空,则返回pr.Value

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

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

    在结果上等效于此:

    string _var;
    if (pr.Value is null) // can throw NullReferenceException
        _var = "NA";
    else
         _var = pr.Value;
    
  3. 如果"NA"为空,则返回pr,如果pr.Value为空,该怎么办?

    ???.都无法为您提供帮助,但是您可以使用三元运算符:

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

    如果"NA"为空,则该值为pr,如果pr.Value为非空,则该值为pr,因此,如果{{1 }}为非null,但pr为null。


注意,对pr.Value运算符的评价也很慢,就像三元运算符一样,因此,如果您具有以下条件:

??

并且该方法调用很昂贵,只有在var _v = pr?.Value ?? ComputeTheValue(); 实际上为空,如果pr?.Value为非空且pr为非空时,才会评估该方法调用被制成。

答案 1 :(得分:2)

  

要检查 pr是否为空,并且不检查pr的Value属性是否为空

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

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

或使用简单的if / else