2011-06-21 64 views
2

所有類型都從Object類派生,但值 類型不分配在堆上。值類型變量實際上包含 它們的值。那麼如何才能將這些類型存儲在數組中,並在需要引用變量的方法中使用?有人可以解釋一下,當它們是數組的一部分時,這些值類型如何存儲在堆中?爲數組分配內存

+0

[C#深度](http://www.manning.com/skeet/)是一個很好的開始。 – naveen

+1

我認爲值類型數組本身不是值類型,這就是爲什麼它像任何複合對象一樣存儲在堆中的原因。 –

+1

值類型**可以在堆棧中分配,但情況並非總是如此......這是一種常見的誤解 –

回答

3

Boxing and Unboxing。有關與數組有關的信息,請參見Here(部分向下)。請注意,這是針對對象數組的,值類型數組(例如int[])沒有任何(un)裝箱。

1

看一看這個問題:

Arrays, heap and stack and value types

您可以將值類型的實例傳遞給期待的對象(引用類)的方法。在這種情況下,會發生裝箱和拆箱。

值類型數組不需要裝箱或拆箱!

+0

非常感謝您的回答。鏈接真的很有用。 – Chat

0

CLR專門處理值類型的數組。當然,數組是一個引用類型,它是在堆上分配的,但值類型值嵌入到堆記錄中(而不是堆棧中)。

類似地,當引用類型類包含一個值類型字段,該字段的值被嵌入到堆上的記錄..

+0

非常感謝您的回覆。我想我知道答案不夠確定。 – Chat

0

值類型可以堆棧進行分配。 只有在參數或局部變量或其他值類型的字段中,纔會發生這種情況。

數組中的數值類型和類中的字段本地存儲在數組或類中,而不是指針存儲在那裏 - 值類型導致更多本地內存訪問(性能改進) 並且在數組的情況下,值n恰好在內存中的值n-1,不能用引用類型數組中的對象保證(包括對象數組中的裝箱值 - 也沒有連續性授予者)。在引用類型的數組中,引用是持續的。