这两个比较状态之间有什么区别?
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比较string
的内容而不是引用,即使string
是引用类型。