前言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方法 。
【为record类型自定义Equals方法】
推荐阅读
- 2022:为什么 NestJS 是最好的后端框架
- C++ 如何判断一个类型是STL容器的类型
- 应该为每个关键词创建一个网站并链接到主站点吗?
- 喝红茶的功效与作用,碧螺春红茶的功效
- 最适合做灶台的材料是什么?
- hr|简历投出去,为何有公司是部门主管先联系我而不是HR?
- 求职|“新型啃老”正在蔓延,父母浑然不知,误认为子女有出息
- 春季养生重点为护肝 肝火上升教你预防
- 宝宝春季为何总爱生病 小儿春天防疾病的妙招
- 为什么春季一到就容易犯困