以下是......
SomeType _someProperty;
public SomeType SomeProperty
{
get
{
if (_someProperty == null)
_someProperty = new SomeType();
return _someProperty;
}
}
...具有与以下相同的功能?
SomeType _someProperty;
public SomeType SomeProperty
{
get { return _someProperty ?? (_someProperty = new SomeType()); }
}
根据ReSharper他们的确如此。如果是这样,有人可以解释第二个块的语法吗?
答案 0 :(得分:9)
是的,它们功能相同。
??
是null coalescing operator。如果不为null,则运算符返回运算符之前的值,如果前面的值为null,则返回运算符之后的值。
在这种情况下,通过将表达式的第二部分包装在params中,如果_requiredFieldValidator
为空,则在返回之前将新对象分配给__requiredFieldValidator
后备字段。
如果没有括号,则在返回之前不会分配,这会导致以下编译错误:
作业的左侧必须是变量,属性或 索引
括号保证正确评估赋值表达式。
答案 1 :(得分:4)
是的,他们是一样的。
??
是null coalescing operator。如果??
左侧的操作数不为null,它将使用该东西,否则它将使用右侧的操作数。
在你的情况下,如果已经初始化它将返回_requiredFieldValidator,否则它将首先初始化然后返回它。
答案 2 :(得分:4)
是的,它们是一样的。 ??
是 Null Coalescence Operator ,它检查第一个操作数与null
,如果它是null
,则返回/运行第二个操作数。
第二个代码块显示"如果它不是_someProperty
,则返回null
。但是,如果 null
,则设置_someProperty = new SomeType()
并返回。"
答案 3 :(得分:4)
我认为这里最混乱的不是来自??运营商。很多人不知道C#中的Assignment operator会返回右手值,因为它的结果。