2010-03-27 57 views
4

查看網絡並找不到任何有關如何實現值類型的文章。如何在.NET中實現值類型

例如,一個Int32是一個結構,它的直接父是System.ValueType,這就是最終母公司爲System.Object的。對象是一個類 - 我想ValueType是一個類?

什麼是類層次結構? CLR應該扮演什麼角色? CLR在什麼階段知道如何將值類型分配給堆棧? (僅供參考,我知道值類型存儲在聲明的位置)。

回答

1

煙霧和鏡子是描述它的最好方式。我會嘗試更好。值類型不支持繼承,並且不能有虛擬方法。但是,int類型具有ToString()和GetHashCode()方法,都是虛擬方法。它從System.Object繼承它們。

這個魔法來自拳擊轉換。有執行它的專用IL操作碼,OpCodes.Box和OpCodes.Constrained。這將一個值類型轉換爲一個對象,一個存儲原始值類型的值。它也相反,拆箱將對象轉換回值類型。

如果你有一個很好的.NET編譯,就像C#的,你從來沒有明確自己調用轉換。當需要這種轉換時,編譯器可以從語言語法中找出併發出所需的IL代碼。

System.Int32類型是編譯器特有的幫助類型。它僅適用於其方法,您從不明確創建它的實例。編譯器在知道你正在調用int「class」的方法時直接調用這些方法。

所有這一切都一起工作,以創建詮釋導出從System.Object(通過System.ValueType)的錯覺。使用「如果看起來像鴨子一樣游泳和跳蚤,它就是一隻鴨子」的原則。

+0

對於一些繼承的System.Object方法還存在一些詭計 - 例如下面的方法不執行裝箱操作: int i = 5; i.ToString(); – Michael 2010-03-27 11:48:29

+0

它爲什麼要裝箱?什麼都沒有說,當一個父類的方法被調用時,類型會被上傳? – Dykam 2010-03-27 12:06:05

+0

這就是System.Int32幫助程序類型的步驟。 – 2010-03-27 12:19:06

1

值類型由各種語言編譯器和CLR特別處理。很簡單,CLR知道從ValueType派生的所有東西都是按值傳遞的,而且本地的ValueType變量存在於堆棧中。

我不知道它是如何更可以說大約值類型,而遊蕩到的「實現定義」的境界。

1

在這種情況下,類層次結構是有點人爲的。無論類型是引用還是值類型都直接存儲在類型元數據中,因此CLR不需要查看它是否從System.ValueType派生。但是System.ValueType確實有點幫助 - 它實現了值平衡檢查和GetHashCode()。

的CLR堆棧對於被標記爲在它的元數據的「.class值」的類型的任何局部變量上分配空間。什麼時候發生這種情況取決於代碼是否被優化。如果它沒有被優化,那麼它會在聲明中發生以幫助調試。如果它可能會盡可能晚地進行優化,但這取決於實施。

我不確定還有什麼要說的,因爲你的問題目前的措辭很廣泛。

+0

噢,抱歉它是一個有點廣闊的 - 我只是沒有在書和博客等發現很多細節上的這一點 - 最終,我不*需要*知道這種事情,但它是相當有趣的是知道怎麼會事發生你可能認爲理所當然的事情。我想我讀過的一些最好的信息是通過C#書中的新CLR,但還是有些東西沒有包含。 – Michael 2010-03-27 11:35:05