2012-09-19 72 views
4

我念叨ValueType class,如果,當一些被澆鑄爲值類型,我想知道它是否得到盒裝?例如:C#拳擊鑄造值類型

void DoSomething(ValueType valueType) 
{ 
} 

DoSomething(5); 

沒有通過DoSomething的方法獲得通過時的字面5代表的int得到盒裝?

+3

我認爲[Marc Gravell在你的鏈接中的提示](http://msdn.microsoft.com/en-us/library/system.valuetype%28v=vs.100%29。aspx#1)是非常明確的,在這個問題:) – dasblinkenlight

+0

另請參見[拳擊發生在C - 銳](http://stackoverflow.com/questions/7995606) – nawfal

+0

可能重複[拳擊賦值爲ValueType? ](http://stackoverflow.com/questions/7205556/boxing-on-assignment-to-valuetype) – colinfang

回答

2

是的,它被裝箱。

想想......對,不要讓盒裝應該有一些共同的二進制表示,可以是任何值類型的價值 - 包括所有內置的那些和任何結構可能會在未來的定義。

由於這樣的二進制表示不存在的值必須被裝箱。

說明:

當調用帶有參數的方法,主叫方置於同意關於位置並在一個位序列的同意關於格式,例如一個int是用編碼爲1補負數32位,一個雙64bit編碼的IEEE浮點格式等

你不能有一個方法,除了unboxed int和double,因爲它不知道要讀取多少位以及如何解碼它們ץ

如果你想有一個方法來接受你都可以給該函數的內存locatio n的值(該位置本身具有已知的大小和格式,所以該方法知道如何解碼它)和一些元數據,所以該方法知道值的實際類型 - 用元數據包裝值並提供它的存儲位置被稱爲(驚喜,驚喜)「拳擊」

因此,無論何時您使用參數/變量/任何不合適的類型傳遞一個值,系統必須將該值填滿或接收器不會知道太多內存值真正使用以及如何從一系列比特中將該內存解碼回數字或結構。

這隻適用於值類型,因爲引用類型總是通過使用內存位置傳遞(內存位置在.net中稱爲「引用」)。

+0

你是什麼意思「常見的二進制表示?」什麼是「int」值類型的常見二進制表示的示例? –

+0

@ZaidMasud - 當你使用參數調用一個方法時,調用者在約定的位置和約定的格式中放置一系列位,例如int是32位,負數編碼爲1-complement,雙位是64位編碼在IEEE浮點格式等 - 你不能有一個方法,除了unboxed int和double,因爲它不知道要讀取多少位以及如何解碼它們,... – Nir

+0

... if你確實需要一種方法來接受你可以給函數的值的存儲位置(位置本身是已知大小和格式,所以該方法知道如何解碼它)和一些元數據,所以該方法知道的實際類型值 - 包裝元數據的價值和提供它的內存位置被稱爲(驚喜,驚喜)「拳擊」 - ... – Nir

0

根據在MSDN article馬克Gravell的評論你鏈接到它。

應當強調的是,雖然值類型可以用來限制 值值類型,鑄造到值類型(隱含地或明確) 仍然是裝箱操作;僅爲混凝土已知值類型 (「日期時間」,「INT」,等等)可以直接作爲處理值類型 - 的ValueType本身被視爲一類(因此拳擊)。