为什么调试版本会多生成一个变量?

这是代码:


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;

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


aluckdog
浏览 74回答 2
2回答

翻阅古今

SharpLab正在获取已编译的IL并尝试将其转换回可读的C#,生成的C#并不总是与最初编译的代码完全匹配。相反,如果我们查看生成的 IL,在调试模式下,我们会得到以下内容(我删除了一些 nop(no-op)指令以保持整洁:.locals init (    [0] class Employee)IL_0001: newobj instance void Employee::.ctor()IL_0006: dupIL_0007: ldstr "Jeff"IL_000c: callvirt instance void Employee::set_Name(string)IL_0012: dupIL_0013: ldc.i4.s 45IL_0015: callvirt instance void Employee::set_Age(int32)IL_001b: stloc.0IL_001c: ret在版本中,它几乎是相同的:IL_0000: newobj instance void Employee::.ctor()IL_0005: dupIL_0006: ldstr "Jeff"IL_000b: callvirt instance void Employee::set_Name(string)IL_0010: dupIL_0011: ldc.i4.s 45IL_0013: callvirt instance void Employee::set_Age(int32)IL_0018: popIL_0019: ret唯一真正的区别是,在 Debug 版本为其 分配局部变量的情况下,发布版本不会,因为它从未使用过,因此不是必需的。employee正如我们所看到的,您在调试版本中看到的“额外”变量实际上并不存在,它只是SharpLab尝试将编译后的IL转换回可读C#的产物,实际上发布版本已经“丢失”了一个局部变量,因为它不是必需的。

白板的微信

我想你应该像这样创建你的第二个对象。Employee employee2 = new Employee();然后employee2= employee;
打开App,查看更多内容
随时随地看视频慕课网APP