【问题标题】:Assigning multiple values in a single statement [duplicate]在单个语句中分配多个值[重复]
【发布时间】:2017-01-26 20:20:42
【问题描述】:

考虑这段代码:

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

为什么?

【问题讨论】:

  • 谢谢,Skeet 的回答很好地解释了这一点。如果你问我,这是错误的做法。

标签: c#


【解决方案1】:

线

object y = x.Value = 2.3;

等价于

object y = 2.3;
x.Value = 2.3;

所以,你会得到结果

y = 2.3
x.Value = 2

更新

研究IL代码后的一些补充信息:

好吧,我们有浮点值2.3yx.Value 需要对象类型。在这种情况下:

  • compiller 声明了一个新变量,我们称之为V (object V)。
  • 压栈浮点值2.3
  • 将此值装箱到对象
  • 复制堆栈顶部的值。因此,我们将在堆栈中有 2 个相同的装箱值(#1、#2)。
  • 弹出 #2 并将其分配给 V
  • 赋值x.Value = V(内部属性值将转换为int
  • 弹出 #1 并将其分配给 V
  • 分配y = V

因此我们得到了这样的结果:

object V = (object)2.3;
x.Value = V;
y = V;

【讨论】:

  • 这不是真的。根据 C# 标准,a = b = c; 等价于 a = (b = c);,因为赋值运算符是右关联的。见标准第 7.17 节。虽然这个领域的标准似乎有点不稳定......
【解决方案2】:

我猜它只是同时分配值,而不是一个接一个。

换句话说,当你写作时

object y = x.Value = 2.3;

解释为

x.Value = 2.3; 
object y = 2.3;

【讨论】:

    【解决方案3】:

    这段代码的返回值:

    x.Value = 2.3

    不是x.Value。吸气剂未运行。赋值运算符返回要赋值的值,这样就可以进行多次赋值。

    执行顺序如下:

    首先,2.3 分配给X.value。我们不关心 setter 对它做了什么,语句 (X.value = 2.3) 返回值 2.3

    从 (X.value = 2.3) 返回的第二个语句被分配给y

    这个概念使多重赋值看起来像两个独立的赋值:

    X.value = 2.3
    object y = 2.3
    

    【讨论】:

      【解决方案4】:

      赋值运算符将右侧操作数的值分配给左侧的变量,并返回分配的值。它不会获取变量或属性的新值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-06
        • 2010-11-28
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多