空传播 - 在空检查时执行函数
Null Propagation - Execute function upon null check
这可以使用 Null 传播运算符 (??) 来实现吗?
origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;
不,空传播不会在这里帮助你,因为它的工作方向与你想要的相反。
它将检查第一部分是否为空,只有在这种情况下才会检查第二部分。运行我无法想象你会如何反转它。
但是正如@JohanP 所说,最好将检查移到您的函数中:
public object GetObj(object input)
{
if (input == null) return null;
....
}
origObj = GetObj(model.ProjectId);
Can this be implemented using Null propagation operator (??) ?
var origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;
首先运算符 ??
是 Null Coalescing 运算符。如果你想使用它,它只是意味着如果 ??
的左侧为空,那么就做右侧,否则做左侧。所以在你的情况下它不会工作因为如果你要写这个:
var origObj = model.ProjectId ?? GetObj(model.ProjectId.Value);
表示:如果model.ProjectId
不为null,则将其赋值给origObj
。否则,从 GetObj(model.ProjectId.Value)
分配 return 值,它将崩溃,因为 model.ProjectId
为空。
Null Propagation 运算符 ?
的工作方式如下:如果 ?
的左侧不为空,则在其上调用一些东西。例如:
public class Foo
{
public void Bar() {}
}
var foo = new Foo();
foo?.Bar();
在你的情况下,三元运算符就可以了。但这完全取决于 return 类型的 GetObj
方法。如果该方法是 returning void
那么它将不会编译。如果该方法是 return 原始类型,那么您将需要像这样进行转换,因为三元运算符的两个分支必须 return 相同的类型。例如,如果 GetObj
是 returning a 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");
}
}
这可以使用 Null 传播运算符 (??) 来实现吗?
origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;
不,空传播不会在这里帮助你,因为它的工作方向与你想要的相反。
它将检查第一部分是否为空,只有在这种情况下才会检查第二部分。运行我无法想象你会如何反转它。
但是正如@JohanP 所说,最好将检查移到您的函数中:
public object GetObj(object input)
{
if (input == null) return null;
....
}
origObj = GetObj(model.ProjectId);
Can this be implemented using Null propagation operator (??) ?
var origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;
首先运算符 ??
是 Null Coalescing 运算符。如果你想使用它,它只是意味着如果 ??
的左侧为空,那么就做右侧,否则做左侧。所以在你的情况下它不会工作因为如果你要写这个:
var origObj = model.ProjectId ?? GetObj(model.ProjectId.Value);
表示:如果model.ProjectId
不为null,则将其赋值给origObj
。否则,从 GetObj(model.ProjectId.Value)
分配 return 值,它将崩溃,因为 model.ProjectId
为空。
Null Propagation 运算符 ?
的工作方式如下:如果 ?
的左侧不为空,则在其上调用一些东西。例如:
public class Foo
{
public void Bar() {}
}
var foo = new Foo();
foo?.Bar();
在你的情况下,三元运算符就可以了。但这完全取决于 return 类型的 GetObj
方法。如果该方法是 returning void
那么它将不会编译。如果该方法是 return 原始类型,那么您将需要像这样进行转换,因为三元运算符的两个分支必须 return 相同的类型。例如,如果 GetObj
是 returning a 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");
}
}