You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Record类型的==运算符与实现IEquatable<T>的类的Equals方法是否等价?

问题:自定义Equals方法与Record的==运算符比较逻辑是否完全一致?

我有一个实现了IEquatable<Clock>接口的Clock类,自定义的Equals方法实现如下:

public bool Equals(Clock? other)
{
    return _hours == other?._hours && _minutes == other._minutes;
}

当我将该类改为record类型后,使用==运算符替代Equals方法进行比较,结果和之前一致。请问能否得出结论:我自定义的Equals方法与Record类型的==运算符执行的比较逻辑完全相同?

测试场景

场景一:自定义class的Equals比较

Clock clock1 = new(2, 10);
Clock clock2 = new(2, 10);
if (clock2.Equals(clock1))
{
    Console.WriteLine("Equal");
}

场景二:record类型的==运算符比较

Clock clock1 = new(2, 10);
Clock clock2 = new(2, 10);
if (clock1 == clock2)
{
   Console.WriteLine("Equal");
}

两种场景均输出Equal,但两者的比较逻辑是否完全一致?


回答

在当前的简单测试场景下,两者行为一致,但不能直接得出比较逻辑完全相同的结论,核心差异点如下:

  • 空值处理逻辑不同
    你的自定义Equals方法仅直接比较成员,若传入null作为参数,other?._hours会返回null(如果_hours是可空值类型),或触发编译错误(如果_hours是非可空值类型);而record自动生成的==运算符会先处理空值:两个null返回true,一个null一个非null返回false,再进行成员比较。

  • 类型检查逻辑不同
    若存在继承场景(比如Clock有派生类AdvancedClock),record的==运算符会先检查两个对象的实际类型是否完全一致,类型不同直接返回false;而你的自定义Equals方法未做类型检查,只要_hours和_minutes相同,会把Clock和AdvancedClock实例判定为相等。

  • 方法覆盖的完整性不同
    record会自动生成一致的==、!=运算符,以及重写object.Equals(object?)、GetHashCode()等方法,确保所有相等性检查逻辑统一;而你的自定义class若仅实现IEquatable<Clock>.Equals,未重写object.Equals,会导致object.Equals仍使用引用比较,出现逻辑不一致的情况。

总结:在无继承、对象非空、成员为值类型的简单场景下,两者行为重合,但在空值处理、继承场景等复杂情况中,逻辑存在明显差异。


内容的提问来源于stack exchange,提问作者Hr.Panahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:15:10