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

作者:MyIO 时间:2023-07-15 21:29:29 

前言:

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,编译也报错:

但是,根据&ldquo;必须允许替代&rdquo;这个错误提示,我们加上了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方法。

来源:https://blog.51cto.com/MyIO/5100083

标签:record,自定义,Equals,方法,NET6
0
投稿

猜你喜欢

  • Django中间件工作流程及写法实例代码

    2021-09-01 17:47:38
  • python SSH模块登录,远程机执行shell命令实例解析

    2022-07-24 21:09:22
  • Go语言hello world实例

    2024-04-26 17:21:32
  • MySQL大小写敏感导致的问题分析

    2024-01-17 05:41:12
  • 在Recordset对象中查询记录的方法

    2008-11-20 16:51:00
  • Django如何实现内容缓存示例详解

    2022-02-23 15:33:01
  • 在SUSE10环境下安装和配置MySQL数据库

    2008-12-17 15:03:00
  • overflow的另类用法

    2008-07-02 12:29:00
  • 微信小程序wx.request拦截 器使用详解

    2023-07-22 09:11:55
  • Python 自动化处理Excel和Word实现自动办公

    2021-06-07 06:41:16
  • 针对google Chrome的 CSS hacks

    2009-11-30 12:45:00
  • 使用html+js+css 实现页面轮播图效果(实例讲解)

    2024-02-24 01:48:44
  • Python实现常见数据格式转换的方法详解

    2023-04-16 03:48:16
  • ACCESS模糊查询出现"内存溢出"

    2009-08-13 14:25:00
  • python编程使用协程并发的优缺点

    2023-07-20 12:11:45
  • python实现12306登录并保存cookie的方法示例

    2021-08-05 18:37:55
  • Python栈算法的实现与简单应用示例

    2023-11-16 23:18:30
  • ShardingSphere数据库读写分离算法及测试示例详解

    2024-01-19 06:21:09
  • Vue.js中的图片引用路径的方式

    2024-05-09 15:28:10
  • 论坛首页效果图设计

    2009-03-19 13:46:00
  • asp之家 网络编程 m.aspxhome.com