2011-05-10 35 views

回答

5
void M() 
{ 
    Artist a = new Artist(); 
} 

當該方法被調用時,一個新的堆棧幀被擴展,則執行之前該方法的第一個語句,如緒論 CLR有一些準備代碼。在此期間,CLR會加載該方法中使用的所有類型。在這個例子中,類型Artist將被加載到堆中。但是類型也可能已經存在,因爲在調用M()之前使用了該類型。然後我們來看第一個表達式,一個new語句,它調用該類的構造函數。如果你看看它產生的CIL,你會看到類似newobj blabla的東西。這裏在堆上分配一塊內存用於存儲實例。塊的大小取決於類的細節,因爲塊需要保存實例的所有數據。通常,塊由通過:

Type pointer + Sync root + Instance data 

型指針指向其上堆(在緒論加載)類型。同步根是鎖定和同步的記錄。實例數據存儲實例的成員數據。

+0

僅供參考,答案很清楚。但是存儲值類型的類型對象在哪裏,值類型對象有:類型指針+同步根目錄+實例數據額外字段? – Spirit 2016-02-03 18:35:39

2

CLR在您的對象實例中存儲了幾位信息。其中之一是指向對象類型的指針。

0

在第一次使用類之前,dotnet運行時會在堆上創建一個對象,該對象存儲有關要使用的類的所有信息。這包括靜態字段,一個指向類可用方法的方法表,一個類型對象指針(一秒鐘更多)和一個同步塊(用於鎖定對象)。

所有對象都有一個類型對象指針,它指向一個存儲有關類的信息的對象。因此,例如,如果您有一個Person對象,它將有一個類型對象指針,指向堆中存儲關於person的所有信息的對象。這個人類型對象也有一個類型對象指針,它指向System.Type的一個對象,因爲它的類型是System.Type(它是一個存儲關於對象類型信息的對象)。

當然System.Type,作爲堆上的對象也有一個類型對象指針,它指向它是什麼類型的信息。正如你可能猜到的那樣 - 它指向自身,因爲System.Type對象是一個System.Type對象。

在對象上調用GetType()時,它只返回存儲在特定對象類型對象指針中的地址。