这两个比较语句有什么不同?

4
这两个比较语句有什么区别?
var result = EqualityComparer<T>.Default.Equals(@this, null);
var result = @this == null;

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

7

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

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


好的,我想我懂了,但是为什么你不能这样做@this == default(T)? - dotnetnoob
@user1437135:在通用方法中,您可以比较的内容是有限制的。我无法立即记住细节(也没有规范在手),但我相信您只能与“null”进行比较,除非您将“T”约束为引用类型。对于任何非可空值类型,与“null”的比较将始终失败。 - Jon Skeet

2
第一条语句调用 T 类中已被重写和实现的 Equals() 方法,以检查对象的值是否相等。第二条语句比较引用,除非像 String 类那样重写了 == 操作符。请注意保留 HTML 标签。

1

操作符==在比较对象时调用ReferenceEquals,因此比较对象是否指向相同的内存位置。

Equals是一个虚方法,因此对于不同类型,可以表现出不同的行为,因为它可以被重写。

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


== 可能 调用 ReferenceEquals。这取决于 @this 的类型。它可能被覆盖。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接