这两个比较陈述之间有什么区别?

时间:2012-09-13 13:37:55

标签: c# .net

这两个比较法的区别是什么?

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

显然,目标是测试对象'@this'是否为空。

3 个答案:

答案 0 :(得分:7)

这取决于@this的类型。如果它没有==的重载,第二行将只执行直接引用比较,而第一行将调用重写的 Equals方法或实现IEquatable.Equals

任何明智的实现都会为两次比较提供相同的结果。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

相反,

Equals只是一种虚拟方法,因此 可以以不同的方式表现,因为它可以被覆盖。

例如,对于CLR string等于比较string内容而非引用,即使string是参考类型。