我有一个名为'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是一样的.从记录的proposal美元开始,

当且仅当每个 以下是事实:

  • other不为空,并且
  • 对于未继承的记录类型中的每个实例字段fieldNSystem.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返回真的条件:

  • _hours_minutesClock的唯一字段
  • _hours_minutes的类型是int,或者任何类型的默认相等比较器返回与将它们与==进行比较相同的内容.
  • Clock没有派生记录(EqualityContract将始终相等)

Csharp相关问答推荐

在实际上是List T的 IESEARCH上多次调用First()是否不好?

Regex在c#中完全匹配

获取ASP.NET核心身份认证cookie名称

使用命令初始化可绑定属性

将XPS转换为PDF C#

.NET 8 Web-API返回空列表

共享暂存/生产环境中Azure事件中心的建议配置

当前的文化决定了错误的文化

在使用Audit.NET的AuditTrail实现中,如何逐月将数据摄取到AzureTableStorage?

为什么AggregateException的Catch块不足以处理取消?

ASP.NET Core MVC将值从视图传递到控制器时出现问题

如何管理Azure认证客户端响应和证书 fingerprint

Blazor Server.NET 8中的Blazore.FluentValidation问题

解决方案:延长ABP框架和ANGING OpenIddict中的令牌生命周期

DropDownListFor未显示选定值

Cmd中的&ping.end()";有时会失败,而";ping";总是有效

如何为控制器PUT操作绑定对象数组

在Swagger中显示自定义属性的属性名称

将带有嵌套If-Else的Foreach循环转换为Linq表达式

ASP.NET重新加载Kestrel SSL证书