这两个比较法的区别是什么?
var result = EqualityComparer<T>.Default.Equals(@this, null);
var result = @this == null;
显然,目标是测试对象'@this'是否为空。
答案 0 :(得分:7)
这取决于@this
的类型。如果它没有==
的重载,第二行将只执行直接引用比较,而第一行将调用重写的 Equals
方法或实现IEquatable.Equals
。
任何明智的实现都会为两次比较提供相同的结果。
答案 1 :(得分:2)
第一个语句调用对象之间的Equals()方法,以查看它们的值是否相等,假设它已被覆盖并在类T
中实现。第二个语句会比较引用,除非==
运算符已被覆盖,如String
类。
答案 2 :(得分:1)
运算符==
在比较对象时调用ReferenceEquals
,因此请比较这些对象指向相同的内存位置。
Equals
只是一种虚拟方法,因此 可以以不同的方式表现,因为它可以被覆盖。
例如,对于CLR string
等于比较string
的内容而非引用,即使string
是参考类型。