CS3L23——object中的方法 
本章代码关键字 
1 2 3 4 5 6 7 8 9 10 Object.Equals()                 Object.ReferenceEquals()     object .GetType()            object .MemberwiseClone()    object .Equals()                object .GetHashCode()        object .ToString()            
 
object中定义的方法 
查看 object 的定义,可以看到 object 有如下的方法
1 2 3 4 5 6 7 8 9 10 11 12 public  class  Object {     public  Object () ;     ~Object();     public  static  bool  Equals (Object? objA, Object? objB ) ;     public  static  bool  ReferenceEquals (Object? objA, Object? objB ) ;     public  virtual  bool  Equals (Object? obj ) ;     public  virtual  int  GetHashCode () ;     public  Type GetType () ;     public  virtual  string ? ToString();     protected  Object MemberwiseClone () ; } 
 
object中的静态方法 
Equals(静态方法) 
静态方法 Equals,用来判断两个值是否相等,最终的判断权 交给左侧对象的 Equals 成员方法(注意不是静态方法!) 
不管值类型还是引用类型都会按照左侧对象 Equals 成员方法会在来进行比较
引用类型,如果不重写其 Equals 成员方法,则判断规则为两个变量是否指向同一个堆空间数据(对象)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class  Test  { }internal  class  Program {     static  void  Main (string [] args )     {         Console.WriteLine(object .Equals(1 , 1 ));              Test t = new  Test();         Test t2 = t;         Console.WriteLine(object .Equals(t, t2));             t2 = new  Test();         Console.WriteLine(object .Equals(t, t2));         } } 
 
输出:
 
ReferenceEquals 
静态方法 ReferenceEquals 
比较两个对象是否是相同的引用,主要是用来比较引用类型的对象 
值类型对象返回值始终是 false
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class  Test  { }internal  class  Program {     static  void  Main (string [] args )     {         Console.WriteLine(object .ReferenceEquals(1 , 1 ));         Test t = new  Test();         Test t2 = t;         Console.WriteLine(object .ReferenceEquals(t, t2));         t2 = new  Test();         Console.WriteLine(object .ReferenceEquals(t, t2));     } } 
 
输出:
 
object中的成员方法 
GetType 
该方法在反射相关知识点中是非常主要的方法,该方法的主要作用就是获取对象运行时的类型 Type, 
通过 Type 结合反射相关知识点可以做很多关于对象的操作,包括通过字符串调用某个类对象的方法等等
详见:CS4L20——反射
1 2 3 4 5 6 7 8 9 10 class  Test  { }internal  class  Program {     static  void  Main (string [] args )     {          Test t3 = new  Test();          Type type = t.GetType();     } } 
 
MemberwiseClone 
MemberwiseClone 是一个 protected 方法,也就是说只能在类及其子类的内部使用, 
如果想要外部使用需要声明一个 public 方法中调用,外部再调用这个
该方法用于获取对象的浅拷贝对象,它会返回一个新的对象, 
但是 新对象中的引用变量成员 会和 老对象的引用变量成员 一致 , 
也就是说,两个对象的引用类型成员都指向同一个数据  
这意味着,修改新对象的值类型的值,不会改变老对象的值类型的值 
而修改新对象的引用类型的值,会一并改变老对象引用类型的值
浅拷贝意味着虽然是两个对象,但是其成员仍然共用一个引用类型的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 class  Test {     public  int  i = 1 ;     public  TestTwo tt = new  TestTwo();        public  Test PublicMemberwiseClone ()     {                  return  MemberwiseClone() as  Test;     } } class  TestTwo {     public  int  i = 2 ; } internal  class  Program {     static  void  Main (string [] args )     {         Test t3 = new  Test();         Test t4 = t3.PublicMemberwiseClone();         Console.WriteLine("修改浅拷贝对象前" );         Console.WriteLine("t3.i = "  + t3.i);         Console.WriteLine("t3.tt.i = "  + t3.tt.i);         Console.WriteLine("t4.i = "  + t4.i);         Console.WriteLine("t4.tt.i = "  + t4.tt.i);         t4.i = 20 ;         t4.tt.i = 21 ;         Console.WriteLine("修改浅拷贝对象后" );         Console.WriteLine("t3.i = "  + t3.i);         Console.WriteLine("t3.tt.i = "  + t3.tt.i);         Console.WriteLine("t4.i = "  + t4.i);         Console.WriteLine("t4.tt.i = "  + t4.tt.i);     } } 
 
输出:
1 2 3 4 5 6 7 8 9 10 修改浅拷贝对象前 t3.i = 1  t3.tt.i = 2  t4.i = 1  t4.tt.i = 2  修改浅拷贝对象后 t3.i = 1  t3.tt.i = 21      t4.i = 20  t4.tt.i = 21  
 
object中的虚方法 
Equals(成员虚方法) 
默认实现还是比较两者是否为同一个引用,即相当于 ReferenceEquals 
但是微软在所有值类型的基类 System.ValueType 中重写了该方法,用来比较值相等 
我们也可以重写该方法,定义自己的比较相等的规则
重写 Equals 成员方法后,将该类传入到 Object.Equals() 后,比较的方式会改变
1 2 3 4 5 6 7 8 class  Test {          public  override  bool  Equals (object ? obj )     {              } } 
 
GetHashCode 
该方法是获取对象的哈希码(哈希码是一种通过算法算出的,表示对象的唯一编码,不同对象哈希码有可能一样,具体值根据哈希算法决定) 
我们可以通过重写该函数来自己定义对象的哈希码算法,正常情况下,我们用的极少,基本不用。
1 2 3 4 5 6 7 8 class  Test {          public  override  int  GetHashCode ()     {              } } 
 
Tostring 
该方法用于返回当前对象代表的字符串,我们可以重写它定义的我们自己的对象转字符串规则 
该方法非常常用,当我们调用打印方法时,默认调用的就是对象的 Tostring 方法后打印出来的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 namespace  lesson22 {     class  TestTwo  { } } class  Test {          public  override  string  ToString ()     {         return  "MrTang申明的字符串" ;     } } internal  class  Program {     static  void  Main (string [] args )     {              TestTwo tt2 = new  TestTwo();         Console.WriteLine(tt2);         Test t = new  Test();                 Console.WriteLine(t);     } } 
 
输出:
1 2 lesson22.TestTwo MrTang申明的字符串