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

在C#中,为什么数组上的Equals()方法只比较它们的引用,而不比较它们的实际内容,c#,arrays,reference,equality,C#,Arrays,Reference,Equality,在C#中,为什么Equals()方法总是通过比较引用而不是通过比较内容来检查两个数组之间的相等性 因此,所有在实现中调用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);

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

因此,所有在实现中调用
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
int[]array1=new[]{1,2,3,4,5,6,7,8,9};
int[]array2=新[]{1,2,3,4,5,6,7,8,9};
var u=array1。等于(array1)//真的
var v=阵列1。等于(阵列2)//假的
var w=数组。等于(数组1,数组2)//假的
var x=(新列表(新int[][{array1})).Contains(array2)//假的
变量y=(新的int[][{array1}).Any(x=>x==array2)//假的
var z=(新int[][{array1,array2}).Distinct().Count()==1//假的
处理阵列(无论类型如何)的一种可能的通用方法是:

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


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

尽管微软的框架类在
Object.Equals(Object)
的含义上有点不一致,但通常
X.Equals(Y)
只有在将对
X
的任意引用替换为对
Y
的引用和/或反之亦然时才会成立,这不会改变所讨论对象的语义。例如,如果
X
是一个内容为“Hello”的
String
,而
Y
是另一个内容相同的字符串,则用对另一个字符串的引用替换对一个字符串的引用通常不会改变它们的行为。虽然使用
ReferenceEquals
测试两个字符串引用是否引用同一个字符串的代码可能会注意到切换,但普通字符串代码不会注意到


一般来说,任何可变对象都不等同于任何其他对象,因此对可变对象的引用都不应等同于另一个对象,除非两个引用都引用同一个对象。对
int[]
的两个不同实例进行引用与对同一实例进行两次引用有很大区别,这两个实例都具有相同的值。虽然
Array
有助于使用
ItemsEqual
方法来测试数组的所有项目或项目的特定范围是否匹配,如果有一个
ImmutableArray
类型,它的
Equals
/
GetHashCode
成员将两个内容相同的不可变数组视为相等的,那么完全正确的做法是,不同的可变数组不考虑内容而彼此比较不相等。

有趣的问题,即使很难按照给定的答案回答(SO用户和C#团队成员的交集非常小)。我们可以从理论上推断,但由于做出决定的人不太可能来到这里,我们中没有人能够现实地回答C#团队在想什么,即使我们可能知道我们自己可能无法做出决定的原因。@Some1.Kill.the.DJ,询问“为什么语言设计者选择了某些特定的实现”对于这个网站来说并不合适。@DJKRAZE,这甚至不是dup。问为什么(并忽略操作——OP明确表示他不关心)是为什么这个questoin应该保持关闭。@DJKRAZE这根本不是重复。你所链接的问题是恰当的,这个问题是问语言设计师为什么要这么做,而不是如何检查与OP的平等性,OP在这里明确表示他不需要知道。