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

目录
  • 一、重写Equals方法
  • 二、自定义Equals方法
  • 三、结论

前言:

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .net6引入autofac框架

    引入NuGet 注册Autofac 在Program的var app = builder.Build():前加上这段代码 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); builder.Host.ConfigureContainer<ContainerBuilder>(builder => { builder.RegisterType<LogRecordsService>

  • .NET6 ConfigurationManager的实现及使用方式

    前言 友情提示:建议阅读本文之前先了解下.Net Core配置体系相关,也可以参考本人之前的文章<.Net Core Configuration源码探究 >然后对.Net Core的Configuration体系有一定的了解,使得理解起来更清晰. 在.Net6中关于配置相关多出一个关于配置相关的类ConfigurationManager,如果大概了解过Minimal API中的WebApplicationBuilder类相信你肯定发现了,在Minimal API中的配置相关属性Configur

  • .NET6使WebApi获取访问者IP地址

    Program.cs文件中 //获取IP使用 builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); Controller中 private readonly IHttpContextAccessor httpContextAccessor; public YangController(IHttpContextAccessor _httpContextAccessor) { httpContextA

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

    目录 一.重写Equals方法 二.自定义Equals方法 三.结论 前言: record类型,这是一种新引用类型,而不是类或结构.record与类不同,区别在于record类型使用基于值的相等性. 例如: public record DemoRecord(int id); public class DemoClass {     public DemoClass(int id)     {         this.id = id;     }     public int id { get;

  • C#中TreeView节点的自定义绘制方法

    本文实例讲述了C#中TreeView节点的自定义绘制方法.分享给大家供大家参考.具体如下: if ((e.State & TreeNodeStates.Selected) != 0) { //演示为绿底白字 e.Graphics.FillRectangle(Brushes.DeepSkyBlue, e.Node.Bounds); Font nodeFont = e.Node.NodeFont; if (nodeFont == null) nodeFont = ((TreeView)sender)

  • C#中DateTime日期类型格式化显示方法汇总

    本文汇总了常用的DateTime日期类型格式化显示方法,方便读者在使用的时候参考借鉴一下.具体如下所示: 1.绑定时格式化日期方法: <ASP:BOUNDCOLUMN DATAFIELD= "JoinTime " DATAFORMATSTRING= "{0:yyyy-MM-dd} " > <ITEMSTYLE WIDTH= "18% " > </ITEMSTYLE > </ASP:BOUNDCOLUMN

  • javascript中对变量类型的判断方法

    在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null, Boolean, Number和String:复杂数据类型是Object,Object中还细分了很多具体的类型,比如:Array, Function, Date等等.今天我们就来探讨一下,使用什么方法判断一个出一个变量的类型. 在讲解各种方法之前,我们首先定义出几个测试变量,看看后面的方法究竟能把变量的类型解析成什么样子,以下几个变量差不多包含了我们在实际编码中常用的类型. var

  • c#在程序中定义和使用自定义事件方法总结

    C#在程序中定义和使用自定义事件可以分为以下几个步骤: 步骤1:在类中定义事件 using System; public class TestClass { //.... public event EventHandler TestEvent } 步骤2:定义事件参数 注意:事件参数类TestEventArgs继承自System.EventArgs using System; public class TestEventArgs : EventArgs { public TestEventArg

  • Spring MVC处理参数中的枚举类型通用实现方法

    前言 在开发的过程中,会涉及到大量的枚举类型数据,我们都知道,Springmvc本身能自动转换很多的数据类型,也支持你自定义转换类型,非常灵活. 本文主要介绍的是关于Spring MVC处理参数的枚举类型通用实现的相关内容,下面话不多说了,来一起看看详细的介绍吧 业务场景: 前端提交了枚举的一个属性value,想由spring来完成参数类型自动转换成对应的枚举. 比方有一个枚举 @AllArgsConstructor(access = AccessLevel.PRIVATE) @Getter @

  • C#中Equals方法的常见误解

    很多C#的教材都会强调对象相等的概念.我们都知道,在C#的世界里存在两种等同性.一种是逻辑等同性:如果两个对象在逻辑上代表同样的值,则称他们具有逻辑等同性.另一种是引用等同性:如果两个引用指向同一个对象实例,则称他们具有引用等同性. 众所周知,Object类型有一个名为Equals的实例方法可以用来确定两个对象是否相等.Object的Equals的默认实现比较的是两个对象的引用等同性.而Object的派生类ValueTpye重写了Equals方法,它比较的是两个对象的逻辑等同性. 也就是说,在C

  • 重写Java中的equals方法介绍

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型,不论是对象数组,列表等都扩展了Object类.了解学习Object中方法的设计原理和实现方式有助于更好的学习理解java语言.下面,我们首先学习一下Object中的equals方法. 判断两个对象相等时,JVM首先查找两个对象的hashCode, 如果两者hashCode不同,则返回false;如果

  • Java编程中避免equals方法的隐藏陷阱介绍

    摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继承类作为面向对象语言中的等价关系的基础问题,要保证派生类的equal正确性语义所会面对的困难.Bloch这样写到: 除非你忘记了面向对象抽象的好处,否则在当你继承一个新类或在类中增加了一个值组件时你无法同时保证equal的语义依然正确 在<Programming in Scala>中的第28章演示

  • Java自定义实现equals()方法过程解析

    这篇文章主要介绍了Java自定义实现equals()方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 以常见的自定义Date类型为例,没有经验的朋友可能会觉得直接比较年月日即可,从而写出以下的实现 public class MyDate implements Comparable<MyDate> { private final int year; private final int month; private final int

随机推荐