在C#中,为什么数组上的Equals()方法只比较它们的引用,而不是它们的实际内容

C# ,为什么Equals()方法总是通过比较引用而不是通过比较内容来检查两个arrays之间的相等性?

因此,所有在其实现中调用Equals()方法(很多)都不能像数组那样工作(它不会比较内容):

示例:

 int[] array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; int[] array2 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; var u = array1.Equals(array1); //true var v = array1.Equals(array2); //false var w = Array.Equals(array1, array2); //false var x = (new List(new int[][] { array1 })).Contains(array2); //false var y = (new int[][] { array1 }).Any(x => x == array2); //false var z = (new int[][] { array1, array2 }).Distinct().Count() == 1; //false 

处理数组的可能通用方法(无类型)可以是:

Object.Equals() :如果要比较的两个类型都是数组(长度相同),枚举项目(总是可能的),对于每个项目,调用Equals() 。 如果其中一个调用返回false ,则数组不同(返回false )否则返回true

注意:我了解SequenceEqual()memcmp()以及比较两个数组的其他方法。 我的问题不是如何比较数组。 我只是想知道为什么C #设计者不选择在Equals()方法中实现完整的数组比较。

尽管微软的Framework类在Object.Equals(Object)含义方面有点不一致,但一般来说X.Equals(Y)只有在用Y引用替换X任意引用时才会为真,反之亦然,不会期望改变有问题的对象的语义。 例如,如果X是具有内容“Hello”的字符串,并且Y是具有相同内容的不同字符串,则将对一个字符串的引用替换为对另一个字符串的引用通常不会改变它们的行为。 虽然使用ReferenceEquals测试两个字符串引用是否引用相同字符串的代码可能会注意到该开关,但普通字符串代码不会。

作为一般规则,任何可变对象都不等同于任何其他对象,因此除非两个引用引用同一对象,否则对可变对象的引用应该等同于另一个。 对两个不同的int[]实例的引用之间存在很大差异,两个实例都具有相同的值,而对同一个实例有两个引用。 虽然使用ItemsEqual方法来测试数组中的所有项目或某些项目范围是否匹配会有所帮助,但是使用具有Equals / GetHashCode成员的ImmutableArray类型会有所帮助两个具有相同内容的不可变数组,不同内容,不同的可变数组相互不相等是完全正确和恰当的。