Dot-Net
IStructuralEquatable 和 IStructuralComparable 解決了什麼問題?
我注意到.NET 4 中添加了這兩個介面和幾個相關的類。它們對我來說似乎有點多餘;我已經閱讀了幾篇關於它們的部落格,但我仍然無法弄清楚它們解決了哪些在 .NET 4 之前很棘手的問題。
IStructuralEquatable和有什麼用IStructuralComparable?
.NET 中的所有類型都支持
Object.Equals()預設情況下比較兩種類型的引用相等性的方法。但是,有時也希望能夠比較兩種類型的結構相等性。最好的例子是數組,它現在在 .NET 4 中實現了
IStructuralEquatable介面。這使得可以區分您是在比較兩個數組的引用相等性還是“結構相等性”——它們是否在每個位置具有相同數量的具有相同值的項目。這是一個例子:int[] array1 = new int[] { 1, 5, 9 }; int[] array2 = new int[] { 1, 5, 9 }; // using reference comparison... Console.WriteLine( array1.Equals( array2 ) ); // outputs false // now using the System.Array implementation of IStructuralEquatable Console.WriteLine( StructuralComparisons.StructuralEqualityComparer.Equals( array1, array2 ) ); // outputs true實現結構相等/可比性的其他類型包括元組和匿名類型——它們都明顯受益於基於其結構和內容執行比較的能力。
你沒有問的一個問題是:
為什麼我們有
IStructuralComparable以及IStructuralEquatable何時已經存在IComparableandIEquatable介面?我要提供的答案是,一般來說,最好區分參考比較和結構比較。通常預計,如果您實施
IEquatable<T>.Equals,您還將覆蓋Object.Equals以保持一致。在這種情況下,您將如何支持引用和結構平等?