什么价值将具有我的对象的属性?

时间:2011-03-30 10:17:22

标签: c#

嗨,在我看来,我的对象的属性应该是2,但是在这段代码之后,仍然是1,为什么?

internal class Program
{
    private static void Main(string[] args)
    {
        MyClass value = new MyClass() { Property = 1 };

        value.Property = value.Property++;
        Console.WriteLine(value.Property);
        Console.ReadKey();
    }
}

internal class MyClass
{
    public int Property;
}

在我看来这应该是值.Property = value.Property ++;首先将value的值和此对象的increment属性赋值,为什么id不起作用?

4 个答案:

答案 0 :(得分:7)

这是做什么的:

  1. 评估右侧value.Property(结果为1)并记住结果
  2. 增量value.Property(现在等于2)
  3. 将记住的结果分配给value.Property(现在再次等于1!)
  4. 如果将Property更改为具有显式getter和setter的属性并将一些调试代码放入setter中,您将看到它确实更改了值1 - > 2 - > 1。

    如果您将value.Property++更改为++value.Property,前两个步骤将会颠倒,所以我们会:

    1. 增量value.Property(现在等于2)
    2. 评估右侧的value.Property(它仍然是2)
    3. 将步骤2的结果分配给value.Property(它仍然是2)
    4. 当然,这是不必要的复杂,甚至可以说是错误的。如果你想增加Property,你所要做的就是:

      ++value.Property;
      

答案 1 :(得分:4)

因为valueProperty++与以下内容相同:

int Increment(ref int value)
{
    var temp = value;
    value = value + 1;
    return temp;
}

答案 2 :(得分:0)

value.Property = value.Property++;

这里的value.Property ++意味着它在递增之前协助1。

答案 3 :(得分:0)

因为=运算符低于运算符优先级的顺序而不是递增。

http://msdn.microsoft.com/en-us/library/6a71f45d.aspx< - 显示运算符及其优先顺序。

首先完全评估增量。然后,增量的返回值通过=运算符。