成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

繼承System.Object類概述

開發 后端
這里介紹繼承System.Object類,System.Object類也可用小寫的object關鍵字表示,兩者完全等同。自然C#中所有的類都繼承System.Object類的公共接口,剖析它們對我們理解并掌握C#中類的行為非常重要。

學習C#語言時,經常會遇到繼承System.Object類問題,這里將介紹繼承System.Object類問題的解決方法。

繼承System.Object類

C#中所有的類都直接或間接繼承System.Object類,這使得C#中的類得以單根繼承。如果我們沒有明確指定繼承類,編譯器缺省認為該類繼承System.Object類。System.Object類也可用小寫的object關鍵字表示,兩者完全等同。自然C#中所有的類都繼承System.Object類的公共接口,剖析它們對我們理解并掌握C#中類的行為非常重要。下面是僅用接口形式表示的System.Object類:

  1. namespace System  
  2. {  
  3. public class Object  
  4. {  
  5. public static bool Equals(object objA,object objB){}  
  6. public static bool ReferenceEquals(object objA,object objB){}  
  7.  
  8. public Object(){}  
  9.  
  10. public virtual bool Equals(object obj){}  
  11. public virtual int GetHashCode(){}  
  12. public Type GetType(){}  
  13. public virtual string ToString(){}  
  14.  
  15. protected virtual void Finalize(){}  
  16. protected object MemberwiseClone(){}  
  17. }  

我們先看object的兩個靜態方法Equals(object objA,object objB),ReferenceEquals(object objA,object objB)和一個實例方法Equals(object obj)。在我們闡述這兩個方法之前我們首先要清楚面向對象編程兩個重要的相等概念:值相等和引用相等。值相等的意思是它們的數據成員按內存位分別相等。引用相等則是指它們指向同一個內存地址,或者說它們的對象句柄相等。引用相等必然推出值相等。對于值類型關系等號“= =”判斷兩者是否值相等(結構類型和枚舉類型沒有定義關系等號“= =”,我們必須自己定義)。對于引用類型關系等號“= =”判斷兩者是否引用相等。值類型在C#里通常沒有引用相等的表示,只有在非托管編程中采用取地址符“&”來間接判斷二者的地址是否相等。

靜態方法Equals(object objA,object objB)首先檢查兩個對象objA和objB是否都為null,如果是則返回true,否則進行objA.Equals(objB)調用并返回其值。問題歸結到實例方法Equals(object obj)。該方法缺省的實現其實就是{return this= =obj;}也就是判斷兩個對象是否引用相等。但我們注意到該方法是一個虛方法,C#推薦我們重寫此方法來判斷兩個對象是否值相等。實際上Microsoft.NET框架類庫內提供的許多類型都重寫了該方法,如:System.String(string),System.Int32(int)等,但也有些類型并沒有重寫該方法如:System.Array 等,我們在使用時一定要注意。對于引用類型,如果沒有重寫實例方法Equals(object obj),我們對它的調用相當于this= =obj,即引用相等判斷。所有的值類型(隱含繼承自System.ValueType類)都重寫了實例方法Equals(object obj)來判斷是否值相等。

注意對于對象x,x.Equals(null)返回false,這里x顯然不能為null(否則不能完成Equals()調用,系統拋出空引用錯誤)。從這里我們也可看出設計靜態方法Equals(object objA,object objB)的原因了--如果兩個對象objA 和objB都可能為null,我們便只能用object. Equals(object objA,object objB)來判斷它們是否值相等了--當然如果我們沒有改寫實例方法Equals(object obj),我們得到的仍是引用相等的結果。我們可以實現接口IComparable(有關接口我們將在“第七講 接口繼承與多態”里闡述)來強制改寫實例方法Equals(object obj)。

對于值類型,實例方法Equals(object obj)應該和關系等號“= =”的返回值一致,也就是說如果我們重寫了實例方法Equals(object obj),我們也應該重載或定義關系等號“= =”操作符,反之亦然。雖然值類型(繼承自System.ValueType類)都重寫了實例方法Equals(object obj),但C#推薦我們重寫自己的值類型的實例方法Equals(object obj),因為系統的System.ValueType類重寫的很低效。對于引用類型我們應該重寫實例方法Equals(object obj)來表達值相等,一般不應該重載關系等號“= =”操作符,因為它的缺省語義是判斷引用相等。

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

實例方法GetHashCode()為相應的類型提供哈希(hash)碼值,應用于哈希算法或哈希表中。需要注意的是如果我們重寫了某類型的實例方法Equals(object obj),我們也應該重寫實例方法GetHashCode()--這理所應當,兩個對象的值相等,它們的哈希碼也應該相等。下面的代碼是對前面幾個方法的一個很好的示例:

  1. using System;  
  2. struct A  
  3. {  
  4. public int count;  
  5. }  
  6. class B  
  7. {  
  8. public int number;  
  9. }  
  10. class C  
  11. {  
  12. public int integer=0;  
  13. public override bool Equals(object obj)  
  14. {  
  15. c=obj as C;  
  16. if (c!=null)  
  17. return this.integer==c.integer;  
  18. else  
  19. return false;  
  20. }  
  21. public override int GetHashCode()  
  22. {  
  23. return 2^integer;  
  24. }  
  25. }  
  26. class Test  
  27. {  
  28. public static void Main()  
  29. {  
  30. A a1,a2;  
  31. a1.count=10;  
  32. a2=a1;  
  33.  
  34. //Console.Write(a1==a2);沒有定義“= =”操作符  
  35. Console.Write(a1.Equals(a2));//True  
  36. Console.WriteLine(object.ReferenceEquals(a1,a2));//False  
  37.  
  38.  
  39. b1=new B();  
  40. b2=new B();  
  41.  
  42. b1.number=10;  
  43. b2.number=10;  
  44. Console.Write(b1==b2);//False  
  45. Console.Write(b1.Equals(b2));//False  
  46. Console.WriteLine(object.ReferenceEquals(b1,b2));//False  
  47.  
  48. b2=b1;  
  49. Console.Write(b1==b2);//True  
  50. Console.Write(b1.Equals(b2));//True  
  51. Console.WriteLine(object.ReferenceEquals(b1,b2));//True  
  52.  
  53. c1=new C();  
  54. c2=new C();  
  55.  
  56. c1.integer=10;  
  57. c2.integer=10;  
  58. Console.Write(c1==c2);//False  
  59. Console.Write(c1.Equals(c2));//True  
  60. Console.WriteLine(object.ReferenceEquals(c1,c2));//False  
  61.  
  62. c2=c1;  
  63. Console.Write(c1==c2);//True  
  64. Console.Write(c1.Equals(c2));//True  
  65. Console.WriteLine(object.ReferenceEquals(c1,c2));//True  
  66. }  
  67. }  

【編輯推薦】

  1. C#窗體里調用淺談
  2. C#調用ListEmployee命令
  3. C# CreateEmployeeDefinition()函數
  4. C#實現斷點續傳詳細剖析
  5. C# Employee對象淺談
責任編輯:佚名 來源: Javaeye
相關推薦

2009-08-27 16:30:10

interface繼承

2009-08-27 10:19:22

C#匿名類型

2009-12-16 09:43:35

Ruby父類Objec

2009-09-09 16:01:21

Linq實體繼承使用

2011-07-07 13:39:14

Cocoa 框架

2009-09-15 10:34:32

System.Data

2011-06-14 15:45:02

Qt Object

2009-09-22 09:13:43

Hibernate D

2021-02-08 08:45:18

Java內部類Object類

2009-08-12 18:10:33

C#類型轉化

2009-09-03 10:42:16

C# Employee

2011-05-25 16:23:35

Javascript類繼承

2009-07-08 17:42:26

this屬性

2009-07-08 17:51:45

constructor

2009-07-08 17:48:18

prototype屬性

2009-12-08 17:29:26

PHP extends

2010-01-21 13:48:30

C++基類

2021-12-23 09:30:35

Java 字節流 Java 基礎

2010-12-08 11:20:08

2009-09-04 13:31:33

C#抽象類
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级黄a视频| 91亚洲国产成人久久精品网站 | 91精品国产综合久久国产大片 | 久久久在线视频 | 二区三区视频 | 久久99国产精品 | 国产成人精品久久二区二区91 | 日日夜夜天天干 | 久久亚洲国产 | 91青青草视频 | 日日夜夜av | 免费观看av网站 | 国产乱码精品一区二区三区五月婷 | 国产精品视屏 | 色偷偷人人澡人人爽人人模 | 伦理二区 | 一级片免费网站 | 国产日韩欧美一区 | 国产精品美女久久久久aⅴ国产馆 | 亚洲一区成人 | 欧美二区三区 | 久草中文在线 | 久草精品视频 | 秋霞a级毛片在线看 | 天天躁日日躁狠狠很躁 | 久久久久久国产精品三区 | 日韩一区二区三区四区五区 | 精品在线一区二区 | 日韩免费一区 | 国产一区二区三区 | 一级黄色日本片 | 国产精品福利在线 | 中文字幕 欧美 日韩 | 岛国av免费在线观看 | 日日日操 | 日韩精品在线观看一区二区 | 成人伊人 | 国产视频二区在线观看 | 黑色丝袜三级在线播放 | 国产高清精品一区二区三区 | 久久精品国产亚洲夜色av网站 |