gpt4 book ai didi

c# - 为没有字段的值对象覆盖 GetHashCode()

转载 作者:行者123 更新时间:2023-11-30 20:24:56 26 4
gpt4 key购买 nike

有时我需要没有字段(消息头、模式等)的值对象,例如:

abstract class RequestHeader
{
}

sealed class FirstRequestHeader : RequestHeader
{
}

我在以下方法中使用它们:

partial class Server
{
private readonly IReadOnlyDictionary<RequestHeader, Action<object>> requestMap;

public void ProcessRequest(RequestHeader header, object request)
{
requestMap[header](request);
}
}

在这种情况下,GetHashCodeEquals 方法的默认实现完全符合我的需要,因为我可以使用单例。

但是因为 FirstRequestHeader 是一个不可变的 value object我希望它表现得像一个真正的值对象:

var a = new FirstRequestHeader();
var b = new FirstRequestHeader();
Console.WriteLine(a == b &&
a.Equals(b) &&
a.GetHashCode() == b.GetHashCode()); // False, but should be True

覆盖 == 运算符和 Equals 方法很容易。

但是在这种情况下重写 GetHashCode 方法的正确方法或推荐方法是什么?

我可以期待一些答案(都有一些缺点):

  • 为每种类型硬编码常量哈希码
  • 每次执行生成一个并将其保存在静态字段中
  • 通过GetType方法使用类型的hashcode
  • 避免空对象(添加字段)

但没有通过搜索证实假设

那么,你会怎么做?

最佳答案

如果没有与该类关联的数据,则只创建一个实例。

sealed class FirstRequestHeader : RequestHeader
{
public static readonly FirstRequestHeader Value = new FirstRequestHeader();

private FirstRequestHeader()
{

}
}

关于c# - 为没有字段的值对象覆盖 GetHashCode(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25403097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com