2011-05-13 23 views
2

我知道什麼是「拳」是:「拳擊」如何在.NET中工作?

object myBox = 5; 

現在,我希望增加我的知識。是爲這個拳擊操作創建的特殊類型?或者是System.Object使用? .NET如何處理拳擊?

+4

有關[拳擊和拆箱]的詳細信息,請參閱msdn(http://msdn.microsoft.com/zh-cn/library/yz2be5wk。aspx) – 2011-05-13 20:30:08

+0

MSDN擁有您需要的所有信息。 http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx – alexn 2011-05-13 20:30:19

+0

是所有關於執行..我沒有想到要查看MSDN內 – 2011-05-13 20:33:19

回答

5

沒有特殊類型;盒裝值類型是運行時的實現細節。但要理解它的最簡單的方法就是想象,有一種特殊類型:

class Box<T> where T : struct 
{ 
    T value; 
} 

凡型Box<T>也實現了所有的方法,接口,等等,T的,不管是什麼牛逼恰好是。所以,舉個例子,你可以想象Box<int>有一個方法ToString,它只是簡單地調用int.ToString的值,然後返回結果。

拳擊只是一種獲取對非參考類型的引用的機制。你只需在盒子周圍製作一個盒子,並獲得盒子的參考。

+0

謝謝你的回答。很像我一直在想的 – 2011-05-13 20:37:50

2

CLR處理拳擊。

考慮在這種情況下會發生什麼:

private void myUselessMethod() 
{ 
    int i = 5; 
    object o = i; 
} 

'i'是值類型(一個Int32),並作爲一個局部變量,是在棧上分配的,它僅配置4個字節,大概。 然後,i被包裝成對象,即盒裝。 什麼CLR(公共語言運行庫)的作用:

  • 它分配在託管堆內存:即,足夠的空間,一個Int32,加上其在託管堆中的每個對象必須有兩個額外的開銷成員空間 - 「類型對象指針」和「同步索引」。
  • 它將值5複製到新分配的堆內存中。
  • 它返回堆中的內存地址作爲引用o。

我覺得最令人困惑的這個裝箱/拆箱/引用類型/值類型的業務是什麼,一方面,一切都是對象,甚至是值類型的對象,並System.Object派生。另一方面,當一個對象被聲明時,它總是一個引用類型。

所以

void myMethod(System.Object o) 
{ 
    doStuff(); 
} 

void myCallingMethod() 
{ 
    int i = 5; 
    myMethod(i); 
} 

將盒I將它傳遞給myMethod的,即使i是int,一個VALUETYPE,因此非常清楚的目的,由於值類型從System.Object衍生得。