2012-04-14 94 views
5

我一直在試圖理解這一段,但不知何故,我不能在我的腦海虛擬化了,有人請詳細說明這一點:拆箱值類型

拆箱不完全相反的拳擊。拆箱操作 比拳擊成本低得多。拆箱實際上就是獲取指向對象內包含的原始值類型(數據字段) 的操作 。實際上,指針指的是盒裝實例中的未裝箱部分 。因此,與裝箱不同,拆箱不涉及 複製內存中的任何字節。澄清之後,重要的是要注意拆箱操作通常是 ,然後複製這些字段。

Richter,Jeffrey(2010-02-05)。 CLR通過C#(Kindle Locations 4167-4171)。 OReilly Media - A. Kindle Edition。

+0

在閱讀段落 – zinking 2013-06-26 08:26:28

回答

6

爲了填充一個int,你需要在堆上創建一個足夠大的對象來存放該結構所擁有的所有數據。在堆上分配一個新對象意味着GC爲GC找到一個位置,併爲GC進行清理/在其生命週期中和之後移動它。這些操作雖然不昂貴,但並不便宜。

要解開一個值類型,你所做的就是去引用指針,可以這麼說。您只需查看參考資料(這是您所擁有的object就是)來查找實際值的位置。在內存中查找價值非常便宜,這就是爲什麼該段說'拆箱'很便宜。

更新:

雖然未裝箱的值類型通常會被拆箱後立即被複制到其他位置,也並不總是如此。請看下面的例子:

public struct MyStruct 
{ 
    private int value = 42; 
    public void Foo() 
    { 
    Console.WriteLine(value); 
    } 
} 

static void Main() 
{ 
    object obj = new MyStruct(); 
    ((MyStruct)obj).Foo(); 
} 

MyStruct爲盒裝入obj但是當它的拆箱它從來沒有任何數據的拷貝,一個方法是簡單地調用就可以了。同樣,你可以將一個屬性/字段從結構中取出,只需複製其中的一部分而不需要複製整個結構。這可能看起來有點做作,但它仍然不是完全荒謬的。也就是說,正如你的引用暗示的那樣,在解開它之後仍然可能複製結構體。

+0

時有完全相同的問題但是在找到值之後,這些值將被複制回堆棧,這是否正確? – Tarik 2012-04-14 02:53:45

+0

@Braveyard不,那不是。一旦價值被拆箱,它將被複制,但它並不需要。此外,它可能不會被複制回堆棧,它可能被複制到堆上某個其他引用類型的字段中。 – Servy 2012-04-14 03:34:45

+0

我在答案中添加了一個代碼示例。 – Servy 2012-04-14 03:40:31