2010-11-18 30 views
2

考慮到這一類:ValueType是否在聲明爲類的一部分時被裝箱?

public class Foo 
{ 
    public Int32 MyField; 
} 

我猜「MyField的」成員不是線程堆棧上,因爲它可以被多個線程訪問,它必須是絕對託管堆中,但確實意味着它每次使用時都是裝盒和拆箱的?

在此先感謝

+0

謝謝大家! – vtortola 2010-11-18 16:06:26

+0

我認爲值類型與引用類型的不同之處的許多解釋可能會誤導讀者,因爲他們傾向於說棧值上存在值類型;如果您正在討論在方法中聲明的值類型變量,那麼情況就是如此。我認爲James Curran的答案在這裏提供了一個很好的建議,即使用術語「Over Here」和「Over There」來描述爲對象分配的內存位置,而不是「在堆棧」和「在堆中」:http:/ /stackoverflow.com/questions/3790436/where-are-value-types-stored-in-c-generic-collections/3790468#3790468 – 2010-11-18 16:31:56

+0

甚至當值類型變量的方法中聲明的,它可以被移動到堆由於許多原因。請參閱Eric Lippert的「關於價值類型的真相」。 http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx – 2010-11-18 18:13:25

回答

8

不,它不是盒裝每次使用時間。只有在將值類型強制轉換爲引用類型時,纔會發生裝箱 - 它與爲實際值分配內存的位置(或者即使分配了任何內存)真的沒有任何關係。

在你的情況,這是你如何作用於MyField的,將決定它是否盒裝,富也不怎麼處理。

//No Boxing 
    var f = new Foo(); 
    f.MyField = 5; 
    int val = f.MyField; 


    //Boxing 
    var f = new Foo(); 
    f.MyFIeld = 5; 
    object val = f.MyField; 

請注意,在第二個示例中val現在包含對boxed int的引用。 MyField仍然是(並且將始終保持)未裝箱int和能夠在不取消裝箱被訪問(感謝指出了需要澄清,LukeH

+2

值得強調的是,在第二個例子中,'val'變量盒裝' int'; 'MyField'本身從未裝盒。 – LukeH 2010-11-18 15:57:40

2

不,值類型未裝盒。

只有當您使用值類型時纔會發生拳擊,例如將int存儲在object的數組中時。即:

object[] a = new object[10]; 
int x = 1; 
a[0] = x; 

在這種情況下,值類型被裝箱。

但存儲爲類中的字段中的值類型不裝箱。

2

沒有,只有當一個值類型作爲一個System.Object處理髮生拳擊(通常是由隱式澆鑄,即通過它作爲方法參數)(例如object)時,他們指派給引用類型變量

1

值類型只得到裝箱。如果您從不將MyField分配給除了int或其他可以投出的結構(例如double)之外的任何東西,它將永遠不會被裝箱。

相關問題