.net - IStructuralEquatable 和 IStructuralComparable 解决什么问题?

标签 .net equality icomparable iequalitycomparer

我注意到 .NET 4 中添加了这两个接口(interface)以及几个相关的类。它们对我来说似乎有点多余;我读过几篇关于它们的博客,但我仍然不明白它们解决了哪些在 .NET 4 之前很棘手的问题。

IStructuralEquatableIStructuralComparable 有什么用?

最佳答案

.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

实现结构相等/可比较性的其他类型包括元组和匿名类型 - 两者都明显受益于基于其结构和内容执行比较的能力。

您没有问的问题是:

Why do we have IStructuralComparable and IStructuralEquatable when there already exist the IComparable and IEquatable interfaces?

我要提供的答案是,一般来说,最好区分引用比较和结构比较。通常预计如果您实现 IEquatable<T>.Equals您还将覆盖 Object.Equals保持一致。在这种情况下,您将如何支持引用和结构平等?

关于.net - IStructuralEquatable 和 IStructuralComparable 解决什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3609823/

相关文章:

c# - 使用 IComparable 对对象进行排序

c# - System.Version 未在 F# 中实现 System.IComparable

.net - Entity Framework 和代码优先开发

python - 列表相同但不被视为相等?

haskell - 为 Free Monad 定义相等实例

javascript - 相等运算符为什么 === 会导致未定义的异常,而 == 按预期工作?

c# - 为什么 IComparable<T> 不继承自 IComparable?

c# .net 跨机器内存映射文件

c# - Visual Studio 2019 未将引用的项目添加到 deps.json

.net - 替换/禁用用于开发/测试的控制组件