记录类型的 == 运算符是否与实现 IEquatable 的类中的“Equals”方法执行等效比较<T>?

问题描述 投票:0回答:1

我有一个名为“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
方法是否与
==
完全相同?

c# class record iequatable
1个回答
0
投票

是的,通过一些基本假设,记录的

==
与您写的
Equals
相同。来自记录的提案

合成的

Equals(R?)
返回 true 当且仅当每个 以下正确的是:

  • 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
     将始终相等)
© www.soinside.com 2019 - 2024. All rights reserved.