0

这是代码:

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;

问题是:为什么调试构建会产生一个引用同一对象的变量?

4

2 回答 2

1

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 版本已经“丢失”了一个本地变量,因为它不是必需的。

于 2019-02-03T09:38:43.287 回答
-1

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

Employee employee2 = new Employee();

然后

employee2= employee;
于 2019-02-03T09:34:45.593 回答