幕后发生了什么,所以代码返回 1 而不是 43?

蒂莫费乌斯

在一本书中找到了这个,但解释太短了。

public class Program
{
    int a = 0;

    private static void Main()
    {
        var val = new Program();
        val.a += val.Foo();

        Console.WriteLine(val.a);
        Console.ReadKey();
    }
    private int Foo()
    {
        a = a + 42;
        return 1;
    }
}

它是否与拳击有关?

罗恩·拜尔

这与拳击无关,这是操作顺序...

class Program
{
    int a = 0;

    static void Main()
    {
        Program val = new Program();
        val.a += val.Foo();
        Console.WriteLine(val.a);

        Console.ReadKey();
    }

    int Foo()
    {
        a = a + 42;
        return 1;
    }
}

那么会发生什么

val.a += val.Foo();

基本上重写为

val.a = val.a + val.Foo();

由于操作顺序,这里是推送到堆栈上的内容:

val.a = 0 
val.Foo = 1

因此,当 的评估val.a += val.Foo()开始时,它保存 的当前值val.a,即为零,然后调用该函数。该函数会修改val.a,但由于它是值类型,因此不会更新原始调用者中保存的值。一旦val.Foo()返回,方程就变成val.a = 0 + 1,因此结果是1而不是43

如果稍微重写一下,你会得到不同的结果:

val.a = val.Foo() + val.a;

然后将导致 43。这是一个操作顺序问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章