有人可以解释以下代码是如何工作的吗?
static int index = 0;
public static int GetNextIndex()
{
return index++;
}
我假设,由于增量操作发生在 return 语句之后,变量'index'永远不会增加。
但是当使用 C# 编译器进行测试时,我观察到“索引”正在增加。
标准编译器如何处理这种情况?
有人可以解释以下代码是如何工作的吗?
static int index = 0;
public static int GetNextIndex()
{
return index++;
}
我假设,由于增量操作发生在 return 语句之后,变量'index'永远不会增加。
但是当使用 C# 编译器进行测试时,我观察到“索引”正在增加。
标准编译器如何处理这种情况?
static int index = 0;
public static int GetNextIndex()
{
return index++;
}
相当于:
static int index = 0;
public static int GetNextIndex()
{
int i = index;
index = index + 1;
return i;
}
因此index
递增。
这是编译器生成的中间语言(IL)(VS2013RC/.NET 4.5.1RC):
.method public hidebysig static int32 GetNextIndex() cil managed
{
.maxstack 8
L_0000: ldsfld int32 ConsoleApplication4.Program::index
L_0005: dup
L_0006: ldc.i4.1
L_0007: add
L_0008: stsfld int32 ConsoleApplication4.Program::index
L_000d: ret
}
那么,那有什么作用呢?假设index
在调用它之前它的值为 6。
L_0000: ldsfld int32 ConsoleApplication4.Program::index
将 的值加载index
到评估堆栈 - 堆栈包含6
.
L_0005: dup
复制堆栈顶部的值 - 堆栈包含6, 6
L_0006: ldc.i4.1
将值加载1
到堆栈中 - 堆栈包含6, 6, 1
L_0007: add
将栈顶的两个值相加,并将结果放回栈中。堆栈包含6, 7
L_0008: stsfld int32 ConsoleApplication4.Program::index
将栈顶值存储到index
. index
现在等于7
,堆栈包含6
.
L_000d: ret
将栈顶 ( 6
) 上的值作为返回值。