當前位置:編程學習大全網 - 編程語言 - object在c#中什麽意思?

object在c#中什麽意思?

C#中所有的類都直接或間接繼承自System.Object類,這使得C#中的類得以單根繼承。如果我們沒有明確指定繼承類,編譯器缺省認為該類繼承自System.Object類。System.Object類也可用小寫的object關鍵字表示,兩者完全等同。

自然C#中所有的類都繼承了System.Object類的公***接口,剖析它們對我們理解並掌握C#中類的行為非常重要。下面是僅用接口形式表示的System.Object類:?

namespaceSystem

{

publicclassObject

{

publicstaticboolEquals(objectobjA,objectobjB){}

publicstaticboolReferenceEquals(objectobjA,objectobjB){}

publicObject(){}

publicvirtualboolEquals(objectobj){}

publicvirtualintGetHashCode(){}

publicTypeGetType(){}

publicvirtualstringToString(){}

protectedvirtualvoidFinalize(){}

protectedobjectMemberwiseClone(){}

}

我們先看object的兩個靜態方法Equals(objectobjA,objectobjB),ReferenceEquals(objectobjA,objectobjB)和壹個實例方法Equals(objectobj)。

在我們闡述這兩個方法之前我們首先要清楚面向對象編程兩個重要的相等概念:值相等和引用相等。值相等的意思是它們的數據成員按內存位分別相等。引用相等則是指它們指向同壹個內存地址,或者說它們的對象句柄相等。

引用相等必然推出值相等。對於值類型關系等號“==”判斷兩者是否值相等(結構類型和枚舉類型沒有定義關系等號“==”,我們必須自己定義)。

對於引用類型關系等號“==”判斷兩者是否引用相等。值類型在C#裏通常沒有引用相等的表示,只有在非托管編程中采用取地址符“&”來間接判斷二者的地址是否相等。

靜態方法Equals(objectobjA,objectobjB)首先檢查兩個對象objA和objB是否都為null,如果是則返回true,否則進行objA.Equals(objB)調用並返回其值。

問題歸結到實例方法Equals(objectobj)。該方法缺省的實現其實就是{returnthis==obj;}也就是判斷兩個對象是否引用相等。但我們註意到該方法是壹個虛方法,C#推薦我們重寫此方法來判斷兩個對象是否值相等。

實際上Microsoft.NET框架類庫內提供的許多類型都重寫了該方法,如:System.String(string),System.Int32(int)等,但也有些類型並沒有重寫該方法如:System.Array等,我們在使用時壹定要註意。對於引用類型,如果沒有重寫實例方法Equals(objectobj),我們對它的調用相當於this==obj,即引用相等判斷。所有的值類型(隱含繼承自System.ValueType類)都重寫了實例方法Equals(objectobj)來判斷是否值相等。

註意對於對象x,x.Equals(null)返回false,這裏x顯然不能為null(否則不能完成Equals()調用,系統拋出空引用錯誤)。從這裏我們也可看出設計靜態方法Equals(objectobjA,objectobjB)的原因了--如果兩個對象objA和objB都可能為null,我們便只能用object.Equals(objectobjA,objectobjB)來判斷它們是否值相等了。

當然如果我們沒有改寫實例方法Equals(objectobj),我們得到的仍是引用相等的結果。我們可以實現接口IComparable來強制改寫實例方法Equals(objectobj)。

對於值類型,實例方法Equals(objectobj)應該和關系等號“==”的返回值壹致,也就是說如果我們重寫了實例方法Equals(objectobj),我們也應該重載或定義關系等號“==”操作符,反之亦然。

雖然值類型(繼承自System.ValueType類)都重寫了實例方法Equals(objectobj),但C#推薦我們重寫自己的值類型的實例方法Equals(objectobj),因為系統的System.ValueType類重寫的很低效。

對於引用類型我們應該重寫實例方法Equals(objectobj)來表達值相等,壹般不應該重載關系等號“==”操作符,因為它的缺省語義是判斷引用相等。

靜態方法ReferenceEquals(objectobjA,objectobjB)判斷兩個對象是否引用相等。如果兩個對象為引用類型,那麽它的語義和沒有重載的關系等號“==”操作符相同。如果兩個對象為值類型,那麽它的返回值壹定是false。

  • 上一篇:javaGUI設計,求做出程序,最好有註釋
  • 下一篇:南寧動漫培訓?
  • copyright 2024編程學習大全網