1、==是直接比较值类型的值或引用类型的引用地址,但==不能用于struct,struct只能用equals来比较。==一般情况下与object.equals得到的结果是相等的。
2、ReferenceEquals为Object下的静态方法,用于比较引用地址。因此所有值类型的比较都为false。string比较特殊,只要字符相等,==、equals、Object.ReferenceEquals 三者得到的结果都是true。
3、对于引用类型,如果需要进行比较,直接用equals来比较,通常都是返回false。因此需要在类中进行重写。
如果是重写object中的equals,那么最好也要重写GetHashCode,具体原因尚没有完全研究清楚,以后会补上。
也可以不重写object中的equals,可实现 IEquatable<T> 中的equals(T obj),这是一个泛型接口,所以不用对obj进行类型检查。
4、对于数组或是元组,可以进行结构比较,即比较数组或元组之间是否有相同的结构和相同的值,数组和元组都实现了IStructuralEquatable接口,该接口的equals是显式实现的。这里直接上代码吧
代码引用自:http://www.cnblogs.com/dudu/p/dotnetfx-IStructuralEquatable.html
int[] array1 = { 1, 2, 3 }; int[] array2 = { 1, 2, 3 }; Console.WriteLine(array1.Equals(array2)); //output False Console.WriteLine(array1 == array2); //output False IStructuralEquatable equ = array1; Console.WriteLine(equ.Equals(array2, StructuralComparisons.StructuralEqualityComparer)); //output True
StructuralComparisons.StructuralEqualityComparer 是一个内置的默认用于比较结构的IEqualityComparer对象,这个接口下有一个Equals方法。在这里,array1的每个元素与array2中的对应的元素,都会分别使用IEqualityComparerc对象中的Equals方法进行比较,如果三次比较都返回true,则IStructuralEquatabl.equals返回true。比较值类型可以用StructuralComparisons.StructuralEqualityComparer,若要比较引用类型,通常需要自己定义IEqualityComparer 5、在用object.equals进行值类型的比较时,比较a.Equals(b),如果b能隐式转换成a,那么就是可视作同类型的比较,如果不能隐式转换,则通常都是返回false
时间: 2024-10-12 17:27:05