iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.NET 6中为record类型自定义Equals方法
  • 486
分享到

.NET 6中为record类型自定义Equals方法

2024-04-02 19:04:59 486人浏览 独家记忆
摘要

目录一、重写Equals方法二、自定义Equals方法三、结论前言: record类型,这是一种新引用类型,而不是类或结构。record与类不同,区别在于record类型使用基于值的

前言:

record类型,这是一种新引用类型,而不是类或结构。record与类不同,区别在于record类型使用基于值的相等性。

例如:

public record DemoRecord(int id);

public class DemoClass
{
    public DemoClass(int id)
    {
        this.id = id;
    }

    public int id { get; }
}

但是,当record类型中的属性是引用类型时,相等性就失效了。

例如:

public record A(int[] ids);

一、重写Equals方法

首先想到的解决方法是像类一样重写Equals方法:

public class DemoClass
{
    public override bool Equals(object obj)
    {
        if (obj == null || obj is not DemoClass demoClass)
        {
            return false;
        }
        return id.Equals(demoClass.id);
    }
}

但是发现record类型居然不提供重写Equals方法的能力

二、自定义Equals方法

反编译示例代码,发现编译器确实为record类型生成了虚拟的Equals方法:

public virtual bool Equals(A other)
{
    return this == other || (other != null && this.EqualityContract == other.EqualityContract && EqualityComparer<int[]>.Default.Equals(this.<ids>k__BackingField, other.<ids>k__BackingField));
}

但是,如果手写override方法,编译报错

如果不加override,编译也报错:

但是,根据“​​必须允许替代​​”这个错误提示,我们加上了virtual方法,居然成功了:

public record B(int[] ids)
{
    public virtual bool Equals(B b)
    {
        if (b is null) return false;
        return ids.SequenceEqual(b.ids);
    }
}

而且反编译示例代码,发现编译器没有再为record类型自动生成虚拟的Equals方法。

三、结论

如果要为record类型自定义Equals方法,必须定义virtual方法。

到此这篇关于.NET 6中为record类型自定义Equals方法的文章就介绍到这了,更多相关record自定义Equals内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: .NET 6中为record类型自定义Equals方法

本文链接: https://www.lsjlt.com/news/142524.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作