C# ??财产中的经营者,它是如何运作的?

时间:2015-05-15 18:11:17

标签: c# operator-keyword

我无法理解它是如何运作的。

private Person _user;

private Person User
{
  get
  {
    return _user ?? ( _user = GetUser() );
  }
}

我第一次引用User属性时,_user为null所以它返回(_user = GetUser())????

我错过了什么?

7 个答案:

答案 0 :(得分:7)

首先,它是null-coalescing operator,如果不是null则返回左手操作数,否则返回右手操作数。

return _user ?? ( _user = GetUser() );

如果_usernull,则会返回GetUser方法返回的内容,并将私有字段设置为它。

所以它的工作原理如下:

  1. GetUser返回分配给_user
  2. 的值
  3. 赋值表达式(_user = GetUser())返回值。
  4. 请参阅:How assignment expression returns value.

答案 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运算符”