为什么调试版本会导致另一个变量?

时间:2019-02-03 09:25:11

标签: c# .net build compilation debug-build

这是代码:

Employee e = new Employee() { Name = "Jeff", Age = 45 };

这是构建调试程序集时的编译方式:

Employee employee = new Employee();
employee.Name = "Jeff";
employee.Age = 45;
Employee employee2 = employee;

这就是构建发行版时的编译方式:

Employee employee = new Employee();
employee.Name = "Jeff";
employee.Age = 45;

问题是:为什么调试生成会导致另一个引用同一对象的变量?

2 个答案:

答案 0 :(得分:1)

SharpLab正在获取已编译的IL,并尝试将其转换回可读的C#,结果C#也不总是与原始已编译代码完全匹配。

如果相反,我们查看生成的IL,则在“调试”模式下,我们将获得以下信息(我删除了一些nop(无操作)指令以保持整洁:

.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

唯一真正的区别是,调试版本为employee分配了局部变量,发布版本则没有,因为它从未使用过,因此也不是必需的。

正如我们所看到的,您在Debug版本中看到的“额外”变量实际上并不存在,这只是SharpLab尝试将已编译的IL转换回可读的C#的一种人工产物,而实际上Release版本已经“丢失了” “是本地变量,因为它不是必需的。

答案 1 :(得分:-1)

我想您应该像这样创建第二个对象。

Employee employee2 = new Employee();

然后

employee2= employee;