比较两个对象相等、克隆 、是否允许实例化继承 CLR学习第六课 狼

   比较两个对象相等、克隆 、是否允许实例化继承 CLR学习第六课 虚方法的Equeals、静态方法的Equals、==、引用类型相等ReferenceEquals;还有他们的一些重载方法。

 一、当我们重写Object中的Equeal方法时必须满足4条规则;1.必须自反,即自己和自己比较返回true;2.必须对此,比较2个类型时,交换位置都必须返回true;3.必须是可以传递的即a=b、b=c,那么a=c; 4.必须前后一致,也就是说,如果2个对象的值没有发生改变,多次调用Equeals方法都必须返回相同的值。

二、如果调用父类的Equals会导致调用Object.Equals方法,就不应该调用该方法。因为Object.Equals比较的是2个引用是否指向同一个对象。如果是同一个对象就返回true;如果不是就返回false,及时这个对象的值相等也返回false。

三、比较2个值类型是否相等,必须比较2个值类型的所有字段是否都相等(Object.Equals), Class1 a = new Class1(); Type thitype = a.GetType(); FieldInfo[] fileds = thitype.GetFields(BindingFlags.Public|BindingFlags.NonPublic); 此方法获得其中的一个类型的所有字段,在找用同样的方法找到另外一个类型的所有字段然后调用Object.Equals方法来比较2个类型对应的字段是否相等。 ==:当==两边都为object时比较2个对象引用是否相等。如果==有其中的一边不为object类型,则调用非obect类型那边的Equals方法进行比较。 int x=5; Object.ReferenceEquals(x,x),这个返回的是false,因为2个x都分别进行了装箱操作,即他们有了不同的地址,所有返回false;

四、 我们重写Equals时应该也重写GetHashCode方法,只重写2个方法中的一个会提示警告。因为一个类型的System。Collection。hashtable类型的实现要求任何2个相等的对象都必须有相同的散列码值。

五、对象克隆ICloneable:一个类是否允许克隆就要看其是否实现了ICloneable接口,该接口有一个Object Clone()的方法,其并未指定实现浅拷贝还是深拷贝,在实现该接口时必须指定是那一种拷贝方式。浅拷贝:只拷贝指向该类型的引用;深拷贝:完全复制一个对象到新的内存中,彼此修改不在有关联。

 六、sealed 不允许继承,abstract不允许实例化,但是2者只能用其一。所有如果要阻止一个对象实例化并且不能继承 必须用sealed 和对该类实现一个private 的构造器,外部不能方法该私有的构造器自然就不能实例化。七、静态构造器又叫 类型构造器;其他的构造器叫实例构造器;clr 等.net下的语言都是基于元数据的所有各种语言写的代码能够共享。元数据和编程语言无关系,元数据通用,实现各种语言无缝集成。

原文地址:https://www.cnblogs.com/gowhy/p/2008806.html