Dot-Net
對值類型呼叫方法會導致 .NET 中的裝箱嗎?
我剛剛參加 Stack Overflow 問題*.NET 中的所有內容都是對象嗎?*.
一位發帖人(在接受答案的評論中)似乎認為對值類型執行方法呼叫會導致裝箱。他向我指出了*Boxing and Unboxing (C# Programming Guide)*,它並沒有準確地指定我們正在描述的案例。
我不是一個相信單一來源的人,所以我只是想獲得關於這個問題的進一步回饋。我的直覺是沒有拳擊,但我的直覺確實很糟糕。:D
進一步闡述:
我使用的範例是:
int x = 5; string s = x.ToString(); // Boxing??如果所討論的結構覆蓋從對象繼承的方法,則不會發生裝箱,因為此處接受的答案表明。
但是,如果結構沒有覆蓋該方法,則會在 callvirt 之前執行“約束” CIL命令。根據文件*OpCodes.Constrained Field*,這會導致裝箱:
如果 thisType 是一個值類型並且 thisType 沒有實現方法,則 ptr 被取消引用,裝箱,並作為“this”指針傳遞給 callvirt 方法指令。
這是您的程式碼的 IL:
L_0001: ldc.i4.5 // get a 5 on the stack L_0002: stloc.0 // store into x L_0003: ldloca.s x // get the address of x on the stack L_0005: call instance string [mscorlib]System.Int32::ToString() // ToString L_000a: stloc.1 // store in s因此,在這種情況下,答案是否定的。