信息

2012-10-23 27 views
6

如果我有兩個班,AB其中B從A派生:信息

class A {} 
class B : A { } 

我可以上溯造型相當愉快的B一個實例A

B b = new B(); 
A a = b; 

現在,我可以理解運行時可以如何確定所述底層類型是B,作爲ECMA-335(公共語言基礎結構(CLI)分區I至VI)的第132頁指出

對象的實例化類型應攜帶充足的信息,以便在運行時恢復其確切類型(包括它們的泛型參數的類型和數量) 。 [理由:這是需要正確 -實例測試,以及在反射實現鑄造和 能力

那麼,如何在運行時知道,雖然背後的類型是B它實際上是存儲在一個A。我知道一個事實,即我看不到B上提供的方法,但如果底層類型爲B,它如何存儲存儲位置類型A

這有道理嗎?

回答

7

的目的是一種B,和CLI知道它是一個B.它知道A中的東西是主要的編譯器,其然後聲明字段本地爲類型A的(或者,在一些例如方法鏈接的情況下,該類型通過方法的返回類型而知道,該方法在IL的呼叫者的中被強加戳記)。所以基本上:調用代碼本身就是「我認爲這是一個A」。作業等通常都可以事先驗證,所以沒有錯誤的風險。如果您試圖破解IL以故意錯誤,那麼運行時會告訴您並拒絕運行該方法。由於這些原因,將一個已知的B值賦值給A local/field不需要任何類型檢查 - 它只是一個直接分配。

+0

乾杯馬克,這是解釋它。 –

3

對象的實際類型始終與對象本身一起存儲在堆上。指向該對象的引用可以是不同的類型,只要該類型可以從實際類型(例如,基類或該類型的已實現的接口)分配即可。

堆上的每個對象都有少量的數據存儲 - 該對象的類型就是其中的一種。