空传播 - 在空检查时执行函数



这可以使用空传播运算符(??)来实现吗?

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

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

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

但正如@JohanP所说,将该检查移动到您的函数中要好得多:

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

这可以使用 Null 传播运算符 (??) 来实现吗?

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

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

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

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

Null 传播运算符?如下工作:如果?的左侧不为 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;

陷阱

最后,如果将 null 检查留给GetObj方法,则最终可能会遇到麻烦,并且如果GetObj方法如下所示,您的程序可能会崩溃:

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

相关内容

  • 没有找到相关文章

最新更新