3

在一个延迟加载的属性获取器中看到了这样的东西:

public SomeClass SomeProperty
{
    get
    {
        return _someVar ?? (_someVar = new SomeClass());
    }
}

对我来说发生了什么似乎很明显,我只是设法通过使用 C# 多年来没有注意到这会起作用:

int i = 0;
(i = 1).GetType();

我想我的主要问题是,这是否有某种特殊名称可以用来搜索有关它的更多信息/向其他人描述它?我想我很好奇是否有任何与之相关的陷阱(执行顺序等,类似于将多个空合并运算符链接在一起时必须考虑的问题),或者是否有任何其他标准用途这就像上面看到的延迟加载的属性 getter(尽管我认为它与替代方案相比并不是特别干净)。

我几乎很尴尬地发布这个,因为这似乎是一件很难不曾想过/见过的事情,哈哈。提前致谢。

4

6 回答 6

3

这只是赋值是 C# 中的表达式的结果。从C# 规范

简单赋值表达式的结果是赋值给左操作数的值。结果与左操作数具有相同的类型,并且始终归类为值。

于 2012-12-05T21:13:55.953 回答
2

它不是具有类型的变量赋值,而是左侧操作数。

任何将被评估并返回类似方法调用的表达式都是相同的。

有关更多信息,请参阅以下页面: http ://en.wikipedia.org/wiki/Expression_(programming ) http://en.wikipedia.org/wiki/Statement_(computer_science)#Expressions

于 2012-12-05T21:08:21.030 回答
1

您必须寻找赋值运算符,它的计算结果是新设置的值。基本上在

(i = 1).GetType();

i 被赋值为 1,整个表达式 (i = 1) 被计算为整数 1。

于 2012-12-05T21:07:58.087 回答
0

这是一条有两个后果或副作用的线。也就是说,它做了两件事:1)它运行赋值;2)它使用整个语句作为另一个语句的右手边(RHS)。null我在可以用作 BOOLEAN 语句的 C++ 中更频繁地看到这一点。

用起来很好,但我个人更喜欢表现力。imo 有两个后果,更容易错过一些东西。当我开始阅读一行时,return我不希望它会产生分配变量的副作用。只是我的 .02。

于 2012-12-05T21:08:47.787 回答
0

赋值是一个和其他表达式一样的表达式,表达式的值就是被赋值的东西。

于 2012-12-05T21:09:06.597 回答
0

长话短说:赋值运算符返回类型等于左侧变量类型的值。

于 2012-12-05T21:17:33.563 回答