Dot-Net

對值類型呼叫方法會導致 .NET 中的裝箱嗎?

  • January 12, 2009

我剛剛參加 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

因此,在這種情況下,答案是否定的。

引用自:https://stackoverflow.com/questions/436363