標籤:
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 FalseConsole.WriteLine(array1 == array2); //output FalseIStructuralEquatable 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
c#equals相關