这两个比较语句有什么区别?
var result = EqualityComparer<T>.Default.Equals(@this, null);
var result = @this == null;
显然,目的是测试对象“@this”是否为空。
好吧,这取决于@this
. 如果它没有 的重载==
,则第二行将仅执行直接引用比较,而第一行将调用重写 Equals
的方法或IEquatable.Equals
.
任何合理的实现都会对两种比较给出相同的结果。
第一条语句在对象之间调用Equals()方法以查看它们的值是否相等,假设它已被覆盖并在类中实现T
。第二条语句改为比较引用,除非该==
运算符已像在String
类中那样被覆盖。
运算符==
调用ReferenceEquals
比较对象,因此比较对象指向相同的内存位置。
Equals
相反,它只是一个虚拟方法,因此对于不同的类型可以表现不同,因为它可以被覆盖。
例如,对于 CLR string
Equals 比较a 的内容string
而不是引用,即使string
是引用类型。