2015-06-02 25 views
2

在msdn規範中,我可以注意到System.Object是.Net中的最終基類。 他們說System.ValueType是一個抽象類,從System.Object繼承和覆蓋像EqualsCompare等方法... 值類型,如boolint等。從System.ValueType所有其他.NET對象繼承System.Object繼承。C#System.Object是最終基類

我對此有2個問題。

  1. 什麼是System.Object的需要?爲什麼不是這裏的首選界面?

上午假設它僅具有2直接兒童(忽略,我們可以創建更多),這是System.ValueType和System.ReferenceType兩者都具有完全不同的實現。

**編輯:**沒有System.ReferenceType。只有Sytem.Object和Sytem.ValueType(覆蓋基類)。 道歉在這裏。

因此可能需要System.Object來處理基本的CLR功能,如使用new()創建對象,強制實施默認構造函數,GC等?

  1. 當我編譯Sytem dll時,看到bool的實現,我只看到了一個struct。
    對於一個類(比如Exception),我看不到繼承System.ReferenceType或System.Object。這個繼承是如何處理的?
    逸岸,什麼是通用類型系統做給MyCustomClass,使其從System.Object繼承(因爲繼承是在編譯時確定正在考慮CTS是做什麼的)

請隨時指正/編輯文章如果我的理解錯誤。

enter image description here

+3

沒有'System.ReferenceType'類,所以我不知道從哪裏得到。 – Servy

+0

所有結構都隱式地從'System.ValueType'繼承,這就是爲什麼你沒有在反編譯的C#中看到它的原因。看看IL,它就在那裏。 –

+0

@Servy:oops .. tat是我的錯誤..我編輯了帖子 – Raghav

回答

10

你必須在這個問題上的許多問題。將來,考慮在每個問題上發佈一個問題。

什麼是System.Object的需要?

問題是模糊的。讓我重述一下。

爲什麼C#類型系統設計成所有非指針類型都有一個共同的基類型?

爲了獲得多態性的好處。在沒有泛型的類型系統中,比如C#1.0類型的系統,您希望能夠創建任意對象的列表。

爲什麼接口不是首選的類類型?

接口指定功能。基類允許共享實現。 Object上的方法具有在派生類型之間共享的實現。

假設它只有2個直接的孩子(忽略我們可以創建更多),即System.ValueType和System.ReferenceType都有完全不同的實現。

這完全是錯誤的。

可能需要

所以System.Object的使用新的()

執行默認的構造函數

沒有處理基本CLR功能類似對象的創建儘管確實最終調用了對象的默認構造函數,但構造函數並沒有做任何事情。所以說這個類型的目的是確保一個不做任何事情的構造函數被調用是一件奇怪的事情。

GC etc?

當我反編譯System.dll中,看看布爾實行號,我剛纔看到一個結構。

正確。您應該知道所有非空,非枚舉結構直接從System.ValueType繼承。

對於一個類(比如Exception),我看不到繼承System.ReferenceType或System.Object。

正確。您應該知道所有類的類型都繼承自System.Object(當然,如果沒有指定其他類型的話)。

這個繼承是如何處理的?

這個問題太模糊了回答。

什麼是通用類型系統做給MyCustomClass,使其從System.Object繼承(因爲繼承是在編譯時確定正在考慮CTS是做什麼的)

我完全不知道是什麼你試圖在這裏問。嘗試使問題更加精確。

你也沒問,但可能是一個問題應該問的是:

是什麼意思,當我說A型由B型繼承?

這意味着類型B的所有成員也是類型A的成員。

全部成員?即使是私人成員?

是。繼承是一種類型的成員也是另一類成員的屬性。

+2

如果我可能猜到最後一個實際問題的目的,我會認爲OP的意思是「如果我沒有指定不同的地方,編譯器/ JIT/CTS/CLR如何將我的類定義爲繼承自'object'基類「? –