C# 在一条语句中分配多个值
考虑以下代码:C# 在一条语句中分配多个值,c#,C#,考虑以下代码: class X { int _value; public object Value { get { return _value; } set { _value = Convert.ToInt32(value); } } } X x = new X(); object y = x.Value = 2.3; 对我来说,它看起来像y==2.0,因为这是x.value的返回值,但结果是y==2.3,即使x.value==2 为什么?线路 object y = x.
class X
{
int _value;
public object Value { get { return _value; } set { _value = Convert.ToInt32(value); } }
}
X x = new X();
object y = x.Value = 2.3;
对我来说,它看起来像y==2.0
,因为这是x.value
的返回值,但结果是y==2.3
,即使x.value==2
为什么?线路
object y = x.Value = 2.3;
相当于
object y = 2.3;
x.Value = 2.3;
所以,你会得到结果
y = 2.3
x.Value = 2
更新
研究IL代码后的一些附加信息:
我们有浮点值2.3
。y
和x.Value
需要对象类型。在这种情况下:
- 编译器声明了一个新变量,我们称之为
(V
)李>objectv
- 按下堆栈浮点值
2.3
- 将此值装箱到对象
- 复制堆栈顶部的值。因此,我们将在堆栈中有两个相同的装箱值(#1,#2)
- 弹出#2并将其分配给
V
- 分配
(内部属性值将转换为x.Value=V
)int
- 弹出#1并将其分配给
V
- 分配
y=V
object V = (object)2.3;
x.Value = V;
y = V;
我猜这只是在同一时间,而不是一个接一个地增加值 换句话说,当你写作的时候
object y = x.Value = 2.3;
它被解释为
x.Value = 2.3;
object y = 2.3;
赋值运算符将右侧操作数的值赋值给左侧的变量,返回赋值。它不会获取变量或属性的新值。此代码段的返回值:
x.Value=2.3
不是x.Value
。getter未运行。赋值运算符返回要赋值的值,以便可以进行多次赋值
执行顺序如下:
object V = (object)2.3;
x.Value = V;
y = V;
首先,2.3被分配给X.value
。我们不关心setter如何处理它,语句(X.value=2.3)
返回值2.3
第二,从(X.value=2.3)返回的语句被分配到y
这一概念使多重分配看起来像两个独立的分配:
X.value = 2.3
object y = 2.3
那不是真的。根据C标准,
a=b=C代码>相当于a=(b=c)代码>,因为赋值运算符是右关联的。见本标准第7.17节。虽然这方面的标准似乎有点古怪……谢谢,Skeet的回答很好地解释了这一点。如果你问我的话,这是错误的做法。