这是代码:
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;
问题是:为什么调试生成会导致另一个引用同一对象的变量?
答案 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;