C# 什么';发生在幕后所以代码返回1而不是43?

C# 什么';发生在幕后所以代码返回1而不是43?,c#,C#,在一本书中发现了这一点,但解释太短了 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()

在一本书中发现了这一点,但解释太短了

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;
    }
}
它是否与拳击有关?

让我们看看:

 // val.a = 0
 Program val = new Program(); 
 // val.a += val.Foo()           can be rewritten as 
 // val.a = val.a + val.Foo()    or initial value of val.a + result of val.Foo()
 // val.a = 0 + 1 
 val.a += val.Foo();  
 // print out 1 
 Console.WriteLine(val.a);   
编辑:如果您想利用副作用(在
Foo()
方法中将
a
分配给
42
),您可以放置(而不是
val.a=val.a+val.Foo()
):

Foo()
上,始终返回1

正确代码:

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

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

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
结果将是43。这是一个操作顺序问题。

return 1
可能不是您想要的。这是一个书本上的小测验。您错过了练习的要点,它显示了操作顺序是如何工作的,预期的代码是正确的,演示的是
a
在调用后变为
1
,而不是
43
。实际上,你的问题是“代码返回1而不是43”。代码中唯一的
return
语句是
return1。很明显,为什么会这样。这是"演习"吗?;您故意编写了令人困惑的代码,并询问人们为什么它的行为方式是这样的?而且,如果你想知道为什么代码要向控制台写入一个特定的值,你应该问这个问题,而不是谈论“return”。是的,我认为它将是42+1,因为
a
Foo()
中被修改了,但是因为在调用
Foo()之前操作已经有了一个0
操作将是0+1,而不是42+1。谢谢 val.a = 0 val.Foo = 1
val.a = val.Foo() + val.a;