在一本书中找到了这个,但解释太短了。
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] 删除。
我来说两句