c# - 幕后发生了什么,所以代码返回 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
,即 0,然后调用该函数。该函数修改val.a
了 ,但因为它是一个值类型,所以它不会更新原始调用者中保存的值。一旦val.Foo()
返回,等式就变成val.a = 0 + 1
,因此结果是1
和不是43
。
如果稍微改写一下,你会得到不同的结果:
val.a = val.Foo() + val.a;
然后将导致 43。这是一个操作顺序问题。
推荐阅读
- python - Tkinter:如何使用文本小部件从用户那里获取书面文本并将它们打印成多行?
- docker - 在 docker 命令“docker run -v $(pwd):/app rasa/rasa:1.10.8-full init --no-prompt”中访问目录?
- c# - 通过 InterfaceMapping 从 TargetMethod 获取 InterfaceMethod-pendant
- python - 用 PyQt5 绘制多点曲线
- python - 将 python 列表作为字符串写入 .txt 文件,无需列表格式
- python - 我究竟做错了什么?CSS 文件在 Django 项目中不起作用
- javascript - 用不同的值替换数组中的重复项
- r - 如何修复找不到对象“x”
- javascript - 在 react-slick 中的最后一张幻灯片后禁用滑动
- spring - 如何让 Spring 将旧版本的 Guava 用于特定的依赖关系,但将新版本用于“主”项目