2013-05-21 64 views
0

MSDNunbox確實盒裝值類型是否與對象中的實際值類型具有相同的地址?

  1. 的對象引用被壓入堆棧。
  2. 對象引用從堆棧中彈出並拆箱到值類型指針。
  3. 值類型指針被壓入堆棧。

在這種情況下,對象引用是否與值類型指針不同? (這兩個值都是堆中值類型的地址,因爲值類型是對象中唯一的成員)?

例如,一個元素數組:該數組的地址與該數組的第一個元素的地址相同。

void Main() 
{ 
    int[] test = new []{1}; 
    unsafe 
    { 
     fixed (int* x = test) 
     { 
      fixed (int* y = &test[0]) 
      { 
       Console.WriteLine((int)x); 
       Console.WriteLine((int)y); // They are equal 
      } 
     } 
    } 
} 

回答

3

爲什麼它需要拆箱成一個值類型的指針?

編輯由280Z28:在指向數據的指針的unbox指令的結果,以允許基於(電勢)的運行時性能的優點如下:

ECMA 335分區III§4.32(節選) :

不同於box,這是使一個值類型的副本在對象應用所需,unbox的值類型從對象複製必需的。通常,它只是計算已存在於裝箱對象內的值類型的地址。

當添加了泛型類型時,unbox.any指令被添加到CIL。與unbox不同,此指令將值本身放在堆棧上,而不是指向值的指針。

結束280Z28

是不是該對象的引用等同於在這種情況下的值類型的指針?

否。對象引用是指對象。值類型指針指向一個值。

想象一下,你有一張12號紙。你把那張紙放在一個盒子裏,然後把盒子放在倉庫裏。這張紙的位置明顯是相關的到框的位置,但它不是相同的到框的位置。受管理的引用是框的位置。值類型指針是紙張的位置。倉庫是託管堆。

也許這會有所幫助。把盒裝的int想象成帶有一個元素的int[]陣列的位置不同於陣列第一個元素的位置,對不對?拆箱實際上是取消引用數組。

這兩個值都是堆中值類型的地址嗎?

第一個值是對對象的引用。另一個是一個指向值類型的託管指針。

A行或B行是否創建m的新副本(抽象地在IL中,而非機器代碼明智的)?

我不能爲了我的生活理解你在這個問題上想要問什麼。 「

+0

」否則你會如何獲得指向該值的指針?「更好的問題是,當「unbox.any」可用時,爲什麼你需要使用'unbox'? 「unbox」僅僅是來自前泛型的剩餘,還是它仍然有用?如果首先存在「unbox.any」,「unbox」是否會添加到CIL中? –

+0

數組位置的全局地址與數組第一個元素位置的全局地址相同。看我更新的例子。所以這讓我想知道引用是否具有與值指針相同的值 – colinfang

相關問題