4

这两个比较语句有什么区别?

var result = EqualityComparer<T>.Default.Equals(@this, null);
var result = @this == null;

显然,目的是测试对象“@this”是否为空。

4

3 回答 3

7

好吧,这取决于@this. 如果它没有 的重载==,则第二行将仅执行直接引用比较,而第一行将调用重写 Equals的方法或IEquatable.Equals.

任何合理的实现都会对两种比较给出相同的结果。

于 2012-09-13T13:40:23.823 回答
2

第一条语句在对象之间调用Equals()方法以查看它们的值是否相等,假设它已被覆盖并在类中实现T。第二条语句改为比较引用,除非该==运算符已像在String类中那样被覆盖。

于 2012-09-13T13:39:48.223 回答
1

运算符==调用ReferenceEquals比较​​对象,因此比较对象指向相同的内存位置。

Equals相反,它只是一个虚拟方法,因此对于不同的类型可以表现不同,因为它可以被覆盖。

例如,对于 CLR stringEquals 比较a 的内容string而不是引用,即使string是引用类型。

于 2012-09-13T13:42:13.167 回答