亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么調試版本會多生成一個變量?

為什么調試版本會多生成一個變量?

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 關注
  • 92 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號