SharpLab 正在获取已编译的 IL 并尝试将其转换回可读的 C#,生成的 C# 并不总是与最初编译的代码完全匹配。
相反,如果我们查看生成的 IL,在 Debug 模式下我们会得到以下信息(我删除了一些 nop(no-op)指令以保持整洁:
.locals init (
[0] class Employee
)
IL_0001: newobj instance void Employee::.ctor()
IL_0006: dup
IL_0007: ldstr "Jeff"
IL_000c: callvirt instance void Employee::set_Name(string)
IL_0012: dup
IL_0013: ldc.i4.s 45
IL_0015: callvirt instance void Employee::set_Age(int32)
IL_001b: stloc.0
IL_001c: ret
在发布时,它几乎相同:
IL_0000: newobj instance void Employee::.ctor()
IL_0005: dup
IL_0006: ldstr "Jeff"
IL_000b: callvirt instance void Employee::set_Name(string)
IL_0010: dup
IL_0011: ldc.i4.s 45
IL_0013: callvirt instance void Employee::set_Age(int32)
IL_0018: pop
IL_0019: ret
唯一真正的区别是 Debug 版本为 分配局部变量employee
,而 Release 版本则没有,因为它从未使用过,因此不需要。
正如我们所见,您在 Debug 版本中看到的“额外”变量实际上并不存在,这只是 SharpLab 尝试将编译后的 IL 转换回可读 C# 的产物,事实上,Release 版本已经“丢失”了一个本地变量,因为它不是必需的。