为什么调试构建会导致多一个变量?
Why does debug build result in one more variable?
这是代码:
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;
问题是:为什么调试构建会导致多一个引用同一对象的变量?
我猜你应该像这样创建你的第二个对象。
Employee employee2 = new Employee();
然后
employee2= employee;
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
分配局部变量,Release 版本没有,因为它从未被使用过,因此不需要。
正如我们所见,您在 Debug 版本中看到的 "extra" 变量实际上并不存在,它只是 SharpLab 试图将已编译的 IL 转换回可读的 C# 的产物,实际上是 Release版本有 "lost" 一个局部变量,因为它不是必需的。
这是代码:
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;
问题是:为什么调试构建会导致多一个引用同一对象的变量?
我猜你应该像这样创建你的第二个对象。
Employee employee2 = new Employee();
然后
employee2= employee;
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
分配局部变量,Release 版本没有,因为它从未被使用过,因此不需要。
正如我们所见,您在 Debug 版本中看到的 "extra" 变量实际上并不存在,它只是 SharpLab 试图将已编译的 IL 转换回可读的 C# 的产物,实际上是 Release版本有 "lost" 一个局部变量,因为它不是必需的。