這裏說得object是C#語言中的類型object,也是Framework中的System.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 同理,故:略
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就是一個類,也是其餘一切類型的基類。他體現了面向對象的三大特性。