namespace Lesson22_面向对象相关_万物之父中的方法 { class Test { public int i = 1; public Test2 t2 = new Test2(); public Test Clone() { return MemberwiseClone() as Test; } //public override bool Equals(object obj) //{ // if (obj is Test t) // { // return this.i == t.i && this.t2.i == t.t2.i; // } // return false; //}//重写Equals方法 用于比较值是否相等 } class Test2 { public int i = 2; } internal class Program { static void Main(string[] args) { #region 知识回顾 //万物之父object //他是所有类的基类 引用类型 //可以用里氏替换原则装载一切对象 //存在装箱和拆箱 #endregion #region 知识点一 object中的静态方法 //静态方法 //Equals 判断两个对象是否相等 //最终的判断权交给最左侧的Equals方法 //不管值类型引用类型都会按照左侧Equals方法规则来进行比较 Console.WriteLine(Object.Equals(1,1));//返回Ture Test t = new Test(); Test t2 = new Test(); Console.WriteLine(Equals(t,t2));//false因为地址不同 Test t3 = t; Console.WriteLine(Equals(t,t3));//这样才为True //ReferencesEquals //用来哦比较引用类型 //值类型对象使用该方法返回的结果永远是false Console.WriteLine(ReferenceEquals(1,1));//false #endregion #region 知识点二 object中的成员方法 //普通方法 //GetType 获取当前对象的类型信息 //这是在反射中非常重要的一个方法 //通过Type结合反射可以做很多关于对象的操作 t = new Test(); Type type = t.GetType(); //MemberwiseClone //用于获取该对象的浅拷贝对象 //口语化的意思就是 克隆一个一模一样的对象 //既 新建一个对象 然后把当前对象的值全部赋值给新对象 //注意:改后者的引用类型值会影响前者 Console.WriteLine("克隆前:"); Test tx = t.Clone(); Console.WriteLine(t.i);//1 Console.WriteLine(t.t2.i);//2 Console.WriteLine(tx.i);//1 Console.WriteLine(tx.t2.i);//2 Console.WriteLine("改变克隆信息后"); tx.i = 20; tx.t2.i = 21; Console.WriteLine(t.i);//1 Console.WriteLine(t.t2.i);//21新对象中的引用类型成员被改变 原对象也被改变了 Console.WriteLine(tx.i);//20 Console.WriteLine(tx.t2.i);//21 #endregion #region 知识点三 object中的虚方法 //虚方法Equals //默认实现还是比较两者是否为同一个引用,相当于ReferenceEquals //但是微软在所有值类型的基类System.ValueType中重写了该方法,用来比较值类型的值是否相等 //虚方法GetHashCode //该方法是获取对象哈希值的一个方法 //(一种通过算法算出的,表示唯一对象的编码,不同对象哈希码有可能一样,具体值根据算法决定) //我们可以通过重写该方法来实现我们自己的哈希算法,正常情况下,使用极少,基本不用 //虚方法ToString //该方法用于返回当前对象代表的字符串信息,可以重写他来定义自己的字符串转换规则 //非常常用。当我们调用Console.WriteLine打印一个对象时,实际上调用的就是该对象的ToString方法 Console.WriteLine(t); #endregion } } }