C#-objetc中的方法
object:万物之父、所有类的基类、引用类型、可利用里氏替换原则装载一切对象、存在装箱拆箱
一:object中的静态方法:
1.1 Equals()
Equals():判断两个对象是否相等。
最终的判断权,交给左侧对象的Equals方法。即不管值类型引用类型都会按照左侧对象Equals方法的规则来进行比较
class Test{public override bool Equals(object obj){return base.Equals(obj);}
}
--------------------------------------------------
Console.WriteLine(Object.Equals(1, 1));//判断值类型的值是否相等
----------------
Test t = new Test();
Test t2 = new Test();
Console.WriteLine(Object.Equals(t, t2));//判断引用类型的地址是否相等
1.2 ReferenceEquals()
比较两个对象是否是相同的引用,主要是用来比较引用类型的对象。
值类型对象返回值始终是false.
Console.WriteLine(Object.ReferenceEquals(t, t2));
//代码中的Object可省略。Object是所有类的基类,则可默认所有类中都有该方法
二:object在的成员方法
2.1 GetType()
反射中重要方法。主要用于获取对象运行时的类型Type。
通过Type结合反射相关知识点可以做很多关于对象的操作。
Test t = new Test();
Type type = t.GetType();
2.2 MemberwiseClone()
用于获取对象的浅拷贝对象,即返回一个新的对象
注意:新对象中的引用变量会和老对象中一致。
该方法是被保护的,只能在子类中调用
class Test{public int i = 1;public Test2 t2 = new Test2();public Test Clone(){ //该方法是被保护的,只能在子类中调用return MemberwiseClone() as Test;}
}
class Test2{public int i = 2;
}
-------------------------------------------------------------
Test t = new Test();
Test tc = t.Clone();
Console.WriteLine("克隆对象后");
Console.WriteLine("t.i = " + t.i);//1
Console.WriteLine("t.t2.i = " + t.t2.i);//2
Console.WriteLine("tc.i = " + tc.i);//1
Console.WriteLine("tc.t2.i = " + tc.t2.i);//2tc.i = 20;
tc.t2.i = 21;
Console.WriteLine("改变克隆体信息后");
Console.WriteLine("t.i = " + t.i);//1
Console.WriteLine("t.t2.i = " + t.t2.i);//21原体发生变化,原体和克隆体存储同一地址
Console.WriteLine("tc.i = " + tc.i);//20
Console.WriteLine("tc.t2.i = " + tc.t2.i);//21
三:object中的虚方法
3.1 Equals()
默认实现还是比较两者是否为同一个引用,即相当于ReferenceEquals。
但是微软在所有值类型的基类System.ValueType中重写了该方法,用来比较值相等。
我们也可以重写该方法,定义自己的比较相等的规则
3.1 GetHashCode()
获取对象的哈希码
哈希码:一种通过算法算出的,表示对象的唯一编码,不同对象哈希码有可能一样,具体值根据哈希算法决定
我们可以通过重写该函数来自己定义对象的哈希码算法,正常情况下,我们使用的极少,基本不用。
3.3 ToString()
返回当前对象代表的字符串,我们可以重写它定义我们自己的对象转字符串规则,
public override string ToString(){return "重写了.ToString()";
}
总结:
1.虚方法 ToString()
自定字符串转换规则
2.成员方法 GetType()
反射相关
3.成员方法 MemberwiseClone()
浅拷贝
4.虚方法 Equals()
自定义判断相等的规则