首页 > 解决方案 > 幕后发生了什么,所以代码返回 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;
    }
}

它是否与拳击有关?

标签: c#

解决方案


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

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,即 0,然后调用该函数。该函数修改val.a了 ,但因为它是一个值类型,所以它不会更新原始调用者中保存的值。一旦val.Foo()返回,等式就变成val.a = 0 + 1,因此结果是1和不是43

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

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

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


推荐阅读