再回首:object是什麼

前言

  這裏說得object是C#語言中的類型object,也是Framework中的System.Object(二者是一個意思)。如其名「面向對象編程」對象就是Object。既然提到面向對象,天然就想到其三大特性:封裝、繼承、多態。算法

 

object其實就一個類

  這個最直接的體現就是在visual studio中選中object 關鍵字而後查看定義(F12),以下圖:編程

 object是一個類,他被封裝爲System.Object。安全

原來,object就和咱們日常寫的普通類是沒什麼區別:構造函數、析構函數、幾個靜態方法、幾個虛方法、GetType、克隆(淺複製)。函數

正是有了這些靜態方法:spa

     A 有了Equals, 因此咱們在平時編程的時候 能夠直接用object.Equals 去按值比較兩個對象.net

     B 有的ReferenceEquals,因此能夠直接使用object.ReferenceEquals去按引用地址比較兩個對象3d

正是有了這些虛方法:對象

   A Equals,因此object對象能夠本身去複寫判斷邏輯blog

     B GetHasCode 同理,故:略繼承

     C Tostring 同理,故:略

引入話題:object的三個Equals比較方法

  public static bool Equals(Object objA, Object objB);

  public static bool ReferenceEquals(Object objA, Object objB);

  public virtual bool Equals(Object obj);

  靜態方法是提供object的默認比較算法。主要是用於值類型和引用類型比較。這裏涉及到另外一個知識點:引用類型 和 值類型,這個知識點我接下來的文章會詳細分析。Equals這個虛方法爲子類提供複寫判斷算法的途徑。

 

 

是類,也是一切類型的基類

  在 C# 的統一類型系統中,全部類型(預約義類型、用戶定義類型、引用類型和值類型)都是直接或間接從Object繼承的。

 一、從上面截圖能夠看出一個提外信息:object=System.Object

 二、咱們平時定義一個類時候,並無顯示寫出 XXX:object,這個是由.net framework自動幫咱們完成的。

 三、一個疑問:全部類直接或簡潔繼承於Object。如上圖例子,是否Parent 繼承於object 而Child有繼承於Parent,因此Child不會直接繼承於Object,而是間接經過Parent來繼承。若是Child不繼承與Parent而是一個單獨的類,那麼Child類就會直接繼承於Object?

 

在來一張圖:

 

由於繼承,因此既是沒用其餘代碼,任何類在沒有實例化對象以前也可訪問來自繼承於Object的靜態方法。示例話以後就能訪問其非靜態方法了。

 

 

其餘零星知識點或經驗

一、object是一切類型的基類,因此在程序中咱們有時會用object做爲方法參數來傳遞一些複雜、動態、未知的參數。

二、所用object做爲數值或者方法類型時候,會涉及到屢次的裝箱、拆箱。這樣的代碼效率底並且不安全,因此後面有.Net Framework 提供了泛型能夠更高效便捷來處理這個問題

三、全部類有直接或間接繼承於System.Object;全部值類型都隱士繼承於System.ValueType,而System.ValueType是一個類,故而也繼承了System.Object.

四、一個坑:衆所周知C#有兩個數據類型(值類型和引用類型),他們都屬於類。值類型即System.ValueType,全部的具體的值類型種類都繼承與她,如int,float 等。全部,對於代碼 int 能夠訪問object基類的靜態方法 Equals,以及int 的變量,能夠訪問基類的方法(由於基類方法是虛方法,在int定義時候以及複寫了全部來及基類的方法)。如上理解是通的,我猜也是爭取的。可是!F12 看源代碼就看不出這層意思,一切都被.net framework 或CLR 特殊處理了。以下圖看看int的方法簽名吧:

int 其實就是一個struct ,而struct是如何,取不能查看其定義。全部這裏只能被動的接受微軟的理論知識了

迴歸主題,老是object就是一個類,也是其餘一切類型的基類。他體現了面向對象的三大特性。

相關文章
相關標籤/搜索