如何解决通过 ReferenceEquals 快速等于深度不可变的 C# 9 记录?
是否有可能告诉 C# 编译器,当被检查的对象具有相同的引用时,深度不可变的记录类型(C# 9+)可以通过立即返回 Equals
来缩短其 true
检查?
“深度不可变记录”是指所有属性在任何深度都是不可变的:
public record MyImmutableRecord {
public int MyProp { get; init; }
public IReadOnlyList<AlsoImmutable> MyList { get; init; }
}
编译器会自动创建一个 Equals
方法来检查所有属性。来自 ILSpy:
public virtual bool Equals(MyImmutableRecord? other)
{
return (object)other != null
&& EqualityContract == other!.EqualityContract
&& EqualityComparer<int>.Default.Equals(MyProp,other!.MyProp)
&& ...
}
首先检查参考可以大大加快速度。当相等时,我们肯定知道内容也相等。如果没有,我们必须继续检查属性:
public virtual bool Equals(MyImmutableRecord? other) {
if (object.ReferenceEquals(this,other)
return true;
return ... // Like above
}
有没有机会告诉编译器我们有这样一个真正不可变的对象并使用这个技巧?或者有人知道这是否是为未来计划的?否则我想我必须为每个不可变记录编写自己的 Equals
实现?
解决方法
答案很简单(感谢评论)。当然,当两个对象的引用相等时,它们总是相等......与它们的可变性无关。可能我刚刚想到这个想法是因为不可变数据结构鼓励开发人员在整个代码中重用和共享对象,这比可变类做的要多得多。
问题应该是:
为什么自动生成的 Equals
方法不包含先检查引用相等性,然后再详细检查成员?
我在 csharplang 项目中问这个:https://github.com/dotnet/csharplang/discussions/4411
EDIT 2021-02-11:这现在是 Visual Studio 16.10 的路线图:https://github.com/dotnet/roslyn/issues/51136
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。