1. 程式人生 > >4.1 所有類型都從 System.Object 派生

4.1 所有類型都從 System.Object 派生

sdn 構造 eth one ber com 哈希 protected 托管

  • "運行時"要求各個類型最終都從 System.Object 派生。(顯示繼承/隱式繼承)
    技術分享
  • 提供公共方法(public):
    • Equals 判斷兩個對象相等,true 表示相等。
    • GetHashCode 返回對象的哈希值。
    • ToString 默認返回類型的完整名稱(this.GetType().FullName
    • GetType 返回 Type 派生的一個類型實例,指出對象的類型,返回的 Type 對象可以與反射類配合,獲取與對象類型相關的元數據信息。GetType 為非虛方法,防止子類重寫,隱瞞其類型,破壞安全性。
  • 提供受保護方法(protected):
    • MemberwiseClone
      MemberwiseClone方法創建的新對象,然後將當前對象的非靜態字段復制到新的對象創建的淺表副本。 如果字段是值類型,則執行字段的按位復制。 如果字段是引用類型,引用將復制。(MSDN)
    • Finalize 垃圾回收判斷應被回收之後,對象內存被實際回收之前,會調用該虛方法。
  • new 操作符創建對象時所作的操作:
    1. 計算類型及其所有基類型(直到 System.Object,盡管它沒有定義自己的實例字段)中定義的所有實例字段需要的字節數。每個對象在堆上都需要一些額外成員—— type object pointer(類型對象指針)和 sync block index (同步塊索引)——來管理對象。這些額外成員的字節要計入對象大小。
    2. 從托管堆中分配類型需要的字節數,從而為對象分配內存,所有的字節都設置為0。
    3. 初始化對象的 type object pointer 和 sync block index 成員。
    4. 調用實例的構造方法,並傳遞 new 調用中指定的實參。大多數編譯器都在構造函數中自動生成代碼來調用積累的構造函數。每個類型的構造函數第一反應則初始化該類型定義的實例字段。
  • 沒有 delete 操作符,沒有辦法顯示的釋放對象分配的內存。CLR 通過垃圾回收機制來自動釋放內存。


  • Object 還提供兩個靜態方法:
    • Equal(Object, Object) 判斷兩個對象相等。

      靜態 Equals(Object, Object) 方法指示兩個對象,objA 和 objB,是否相等。 它還使您能夠值是相等的 null 的測試對象。 它將 objA 和objB 相等的如下:

      • 它確定兩個對象是否表示同一對象引用。 如果參數,則方法返回 true。 此測試具有名為 ReferenceEquals 方法等效。 此外,在中,如果 objA 和 objB 是 null,該方法返回 true。
      • 它確定 objA 或 objB 是否 null。 如果是這樣,則返回 false。
      • 如果兩個對象不表示同一對象引用,且均不為 null,它調用 objA。Equals(objB)和返回結果。 這意味著,如果 objA 重寫 Equals(Object) 方法,該重寫調用。
    • ReferenceEquals 確定指定的 Object 實例是否是相同的實例。

      不像 Equals 方法和相等運算符,ReferenceEquals 方法不能被重寫。 為此,如果要測試兩個對象引用的平等,且不確定 Equals 方法的實現時,可以調用 ReferenceEquals 方法。 但是,請註意,如果 objA 和 objB 是值類型,則它們先裝箱,然後傳遞給 ReferenceEquals 方法。

4.1 所有類型都從 System.Object 派生