欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

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

时间:2023-02-22 09:38:05|栏目:.NET代码|点击:

前言:

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方法。

上一篇:WPF框架Prism中使用MVVM架构

栏    目:.NET代码

下一篇:VS2019中.NET如何实现打日志功能

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

本文地址:http://www.codeinn.net/misctech/226250.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有