为什么调试版本导致一个更多变?

问题描述 投票:0回答:2

这是代码:

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;

现在的问题是:为什么调试版本会导致一个更变量引用同一个对象?

c# .net build compilation debug-build
2个回答
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

唯一的区别是,在Debug版本分配一个本地变量employee,发行版没有因为它从来没有使用过,所以不是必需的。

正如我们所看到的“额外”的变量,你在Debug版本中看到实际上并不存在,它只是SharpLab企图编译IL转换回可读C#的假象,而事实上Release版本已经“丢失”本地变量,因为它不是必需的。


-1
投票

我想你应该创建这样的第二个对象。

Employee employee2 = new Employee();

然后

employee2= employee;
© www.soinside.com 2019 - 2024. All rights reserved.