.NET 6中为record类型自定义Equals方法
作者:MyIO 发布时间:2023-07-15 21:29:29
标签:record,自定义,Equals,方法,NET6
前言:
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方法。
来源:https://blog.51cto.com/MyIO/5100083


猜你喜欢
- 一:手写数字模型构建与保存1 加载数据集# 1加载数据digits_data = load_digits()可以先简单查看下 手写数字集,如
- 目录输出算法操作封装的操作含时演化算符的分解QFT的分解总结概要输出算法操作首先介绍一个最基本的使用方法,就是使用ProjectQ来打印量子
- 前言最近需要通过python来获取cad模型的内容信息,然而笔者也没学过python,只能用过查询+动手摸索一步一步进行下去,然后通过dxf
- 本篇文章通过调用opencv里的函数简单的实现了对图像里特定颜色提取与定位,以此为基础,我们可以实现对特定颜色物体的前景分割与定位,或者特定
- 第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load
- 本文实例讲述了C#实现Excel表数据导入Sql Server数据库中的方法。分享给大家供大家参考,具体如下:Excel表数据导入Sql S
- 前言当我们开始准备数据建模、构建机器学习模型的时候,第一时间考虑的不应该是就考虑到选择模型的种类和方法。而是首先拿到特征数据和标签数据进行研
- ERROR 1819 (HY000): Your password does not satisfy the current policy
- 1 停机方案发布公告停止服务离线数据迁移(拆分,重新分配数据)数据校验更改配置恢复服务回滚预案2 停写方案支持读写分离升级公告中断写操作,隔
- 1.颜色空间转换使用cv2.cvtColor(input_image ,flag),flag为转换类型常用的转换类型有:BGR和灰度图的转换
- 感谢 Dawn CSS Reset 的尝试和建议。针对字体的写法,觉得需要说明一下:body,button, input, select,
- 触发器权限和所有权CREATE TRIGGER 权限默认授予定义触发器的表所有者、sysadmin 固定服务器角色成员以及 db_owner
- 1.用CSS实现布局让我们一起来做一个页面,首先,我们需要一个布局。请使用CSS控制3个div,实现如下图的布局。考察应试者的基本布局知识—
- 本文实例讲述了Python基于pyCUDA实现GPU加速并行计算功能。分享给大家供大家参考,具体如下:Nvidia的CUDA 架构为我们提供
- 这个仿msn的右下角popup提示窗口效果很久以前收集的,现在整理出来给大家分享,需要的朋友可以拿去用,特点,提示窗口内容和js代码分离容易
- 原问题是这样的:如何用SQL语句(不是Oracle),求出下表每一行的5个字段中的最大值,最后生成一个新字段。例如:第一行最大值 -5.0
- 如下所示:f = open('./val.txt')lines = f.readlines() #整行读取f.close()
- Base64是一种用64个字符来表示任意二进制数据的方法。用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文
- Internet的规模每一百天就会增长一倍,客户希望获得7天×24小时的不间断可用性及较快的系统反应时间,而不愿屡次看到某个站点“Serve
- 对于商业数据库而言,数据库升级是一个优先级很高的事情,有版本升级路线图,有相应的补丁,而且对于方案还有一系列的演练,显然是一场硬仗。而在My