这是代码:
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;
现在的问题是:为什么调试版本会导致一个更变量引用同一个对象?
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
唯一的区别是,在Debug版本分配一个本地变量employee
,发行版没有因为它从来没有使用过,所以不是必需的。
正如我们所看到的“额外”的变量,你在Debug版本中看到实际上并不存在,它只是SharpLab企图编译IL转换回可读C#的假象,而事实上Release版本已经“丢失”本地变量,因为它不是必需的。
我想你应该创建这样的第二个对象。
Employee employee2 = new Employee();
然后
employee2= employee;