在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
处理数组(无论类型如何)的一种可能的通用方法可能是:
In Object.Equals()
: 如果要比较的两种类型都是数组(长度相同),则枚举项目(总是可能的),对于每个项目,调用Equals()
. 如果这些调用之一返回false
,则数组不同(返回false
),否则返回true
。
注意:我知道SequenceEqual()
,memcmp()
和其他比较两个数组的方法。我的问题不是关于如何比较数组。我只是想知道为什么 C#
设计者不选择在方法中实现全数组比较Equals()
。