为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
aluckdog 2022-08-20 17:39:59
这是代码: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;问题是:为什么调试生成会产生一个引用同一对象的变量?
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

SharpLab正在获取已编译的IL并尝试将其转换回可读的C#,生成的C#并不总是与最初编译的代码完全匹配。


相反,如果我们查看生成的 IL,在调试模式下,我们会得到以下内容(我删除了一些 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


正如我们所看到的,您在调试版本中看到的“额外”变量实际上并不存在,它只是SharpLab尝试将编译后的IL转换回可读C#的产物,实际上发布版本已经“丢失”了一个局部变量,因为它不是必需的。


查看完整回答
反对 回复 2022-08-20
?
白板的微信

TA贡献1883条经验 获得超3个赞

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

Employee employee2 = new Employee();

然后

employee2= employee;


查看完整回答
反对 回复 2022-08-20
  • 2 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信