我有一个名为“Clock”的类,它实现了 IEquatable 接口。我在类中实现了“Equals”方法来比较两个对象,如下所示:
public bool Equals(Clock? other)
{
return _hours == other?._hours && _minutes == other._minutes;
}
当我将
class
更改为 record
类型并用 Equals
运算符替换 ==
方法时,结果保持不变。我是否可以得出结论,我的类中的 Equals 方法本质上执行的比较与 ==
运算符对记录类型执行的比较相同?
场景一: 我有两个像这样的 Clock 类对象,并且想要使用我添加到类中的
Equals
方法检查两个对象的值是否相等。
Clock clock1 = new(2, 10);
Clock clock2 = new(2, 10);
if (clock2.Equals(clock1))
{
Console.WriteLine("Equal");
}
第二种情况:将我的
class
更改为 record
类型并使用 ==
运算符比较两个对象
Clock clock1 = new(2, 10);
Clock clock2 = new(2, 10);
if (clock1 == clock2)
{
Console.WriteLine("Equal");
}
在这两种情况下,它们都返回 true。我想知道
Equals
方法是否与 ==
完全相同?
是的,通过一些基本假设,记录的
==
与您写的Equals
相同。来自记录的提案,
合成的
返回 true 当且仅当每个 以下正确的是:Equals(R?)
不为空,且other
- 对于未继承的记录类型中的每个实例字段
,其值fieldN
,其中System.Collections.Generic.EqualityComparer<TN>.Default.Equals(fieldN, other.fieldN)
是字段类型,TN
- 如果存在基本记录类型,则为
的值(对base.Equals(other)
的非虚拟调用); 否则为public virtual bool Equals(Base? other)
的值。EqualityContract == other.EqualityContract
如果我们假设一些基本的事情,例如:记录类型包括合成的
和==
运算符 相当于如下声明的运算符:!=
public static bool operator==(R? left, R? right) => (object)left == right || (left?.Equals(right) ?? false); public static bool operator!=(R? left, R? right) => !(left == right);
操作符调用的Equals
方法就是上面指定的==
方法。Equals(R? other)
,您的
Clock.Equals
满足合成的Equals
返回true的条件
_hours
和
_minutes
是
Clock
的唯一字段
_hours
和
_minutes
的类型是
int
,或者该类型的默认相等比较器返回与将它们与
==
进行比较时相同的东西。
Clock
没有派生记录(
EqualityContract
将始终相等)