我无法理解它是如何运作的。
private Person _user;
private Person User
{
get
{
return _user ?? ( _user = GetUser() );
}
}
我第一次引用User属性时,_user为null所以它返回(_user = GetUser())????
我错过了什么?
答案 0 :(得分:7)
首先,它是null-coalescing operator,如果不是null
则返回左手操作数,否则返回右手操作数。
return _user ?? ( _user = GetUser() );
如果_user
为null
,则会返回GetUser
方法返回的内容,并将私有字段设置为它。
所以它的工作原理如下:
GetUser
返回分配给_user
_user = GetUser()
)返回值。 答案 1 :(得分:2)
该代码基本上与此相同:
private Person _user;
private Person User
{
get
{
if (_user == null) _user = GetUser();
return _user;
}
}
工作原理
空合并运算符(??
)如果对象不为空则返回该对象,否则返回运算符另一侧的任何对象。所以声明:
return _user ?? ( _user = GetUser() );
表示"返回_user
,除非它为空,在这种情况下返回作业( _user = GetUser() )
"的结果。这是一种将值赋值给_user
并在同一行返回指定值的巧妙方法。
话虽如此,一些开发人员会争辩说我上面写的第一个方法,它使用两行而不是一行,更具可读性(意图更清晰),更易于维护。
答案 2 :(得分:0)
它被称为Null Coalescing运营商。如果它左侧的对象为null,则它将在右侧执行表达式。
此处,右侧的操作员设置_user
对象,因此下次引用User
时,它将不再执行右侧,并返回_user
答案 3 :(得分:0)
assingment expression =
都会对_user
进行赋值并返回已赋值的值,因此可以像表达式一样使用它。
答案 4 :(得分:0)
所以在Habibs提示之后我在MSDN中找到了这个。 = Operator (C# Reference) 哪里清楚......
"赋值运算符(=)将其右侧操作数的值存储在由其左侧操作数表示的存储位置,属性或索引器中,并将该值作为结果返回强力>"
我仍然无法相信我不知道。
答案 5 :(得分:-1)
??是以下语法糖:
if(_user != null)
return _user; // first part before ??
else
return (_user = GetUser() ); //Second part after ??
编辑:
正如@Rufus L所指出的那样:
(_user = GetUser() );
部分将GetUser
的返回值分配给_user
,然后返回_user的值。如果我们简化以前的代码:
if(_user != null)
return _user;
else
{
_user = GetUser();
return _user;
}
额外信息:您可以链接分配,只要类型相同,或者实现隐式转换:
int x, y, z;
x = y = z = 4;
答案 6 :(得分:-2)
它基本上首先检查_user
是否不是null
。如果不为null则返回它。否则,它会将_user
设置为GetUser()
返回的任何内容。
伪代码
_user != null
return _user
otherwise
_user = GetUser()
这是一个post,讨论“Null Coalescing运算符”