.NET 6中为record类型自定义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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
asp.net mvc4中bootstrap datetimepicker控件的使用
这篇文章主要介绍了asp.net mvc4项目里bootstrap datetimepicker控件的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-10-10ASP.NET中Application和Cache的区别分析
在asp.net中储存数据的方式有很多,包括application,session,cache, cookie, viewstate。其中application和cache的应用范围,使用方式都比较相似,这里主要对比一下这两种方式。2010-03-03SQL为查询的结果加上序号(ROW_NUMBER) 合并多个查询结果
SQL为查询的结果加上序号(ROW_NUMBER) 合并多个查询结果2010-03-03.NET Core 1.0创建Self-Contained控制台应用
这篇文章主要为大家详细介绍了.NET Core 1.0创建Self-Contained控制台应用的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-04-04.NET性能调优之一:ANTS Performance Profiler的使用介绍
本系列文章主要会介绍一些.NET性能调优的工具、Web性能优化的规则(如YSlow)及方法等等内容。成文前最不希望看到的就是园子里不间断的“哪个语言好,哪个语言性能高”的争论,不多说,真正的明白人都应该知道这样的争论有没有意义,希望我们能从实际性能优化的角度去讨论问题2013-01-01
最新评论