空传播 - 空检查时执行功能

时间:2017-06-14 00:55:27

标签: c# null-propagation-operator

可以使用Null传播运算符(??)?

来实现
origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;

2 个答案:

答案 0 :(得分:3)

不,null传播在这里不会帮助你,因为它的工作方向与你想要的相反。

它将检查第一部分是否为空,并且仅在该情况下运行第二部分。我无法想象你会如何反转它。

但正如@JohanP所说,将支票移入你的功能要好得多:

public object GetObj(object input)
{
   if (input == null) return null;
   ....
}

origObj = GetObj(model.ProjectId);

答案 1 :(得分:0)

  

可以使用Null传播运算符(??)?

来实现
var origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;

首先,运算符?? Null Coalescing 运算符。如果你想使用它,它只是意味着??的左侧是否为空,然后右侧做左侧。所以在你的情况下,它将无法工作,因为如果你写这个:

var origObj = model.ProjectId ?? GetObj(model.ProjectId.Value);

这意味着:如果model.ProjectId不为空,请将其分配给origObj。否则,从GetObj(model.ProjectId.Value)分配返回值,它将崩溃,因为model.ProjectId为空。

Null Propagation 运算符?的工作方式如下:如果?的左侧不为null,则调用其中的内容。例如:

public class Foo
{ 
    public void Bar() {}
}

var foo = new Foo();
foo?.Bar();

在你的情况下,三元运算符会很好。但这一切都取决于GetObj方法的返回类型。如果方法返回void,那么它将无法编译。如果方法返回一个基本类型,那么你需要像这样进行转换,因为三元运算符的两个分支必须返回相同的类型。例如,如果GetObj返回bool,那么您需要这样:

 var origObj = model.ProjectId != null 
     ? GetObj(model.ProjectId.Value) : 
     (bool?)null;

<强>疑难杂症

最后,如果您将空检查留给GetObj方法,您可能会遇到麻烦,如果GetObj方法是这样的话,您的程序可能会崩溃:

public object GetObj(object value)
{
    if (value == null)
    {
        throw new InvalidOperationException("Cannot call with null");
    }
}