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

tig*_*rou 9 c# arrays equality reference

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<int[]>(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
Run Code Online (Sandbox Code Playgroud)

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

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

注:我知道SequenceEqual(),memcmp()和其他方式来比较两个数组.我的问题不是如何比较数组.我只是想知道为什么C #设计师不选择在Equals()方法中实现完整的数组比较.

sup*_*cat 7

虽然微软的框架类是关于什么遗憾的是有点不一致Object.Equals(Object)的意思,一般X.Equals(Y)如果更换任意的引用将只真正X有参考文献Y,和/或反之亦然,预期不会改变讨论的对象的语义.例如,如果XString具有内容"Hello"的a,并且Y是具有相同内容的不同字符串,则将对一个字符串的引用替换为对另一个字符串的引用通常不会改变它们的行为.虽然ReferenceEquals用于测试两个字符串引用是否引用相同字符串的代码可能会注意到该开关,但普通字符串代码不会.

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