gpt4 book ai didi

c# - GetHashCode() 虚拟实现(如果不需要)

转载 作者:行者123 更新时间:2023-11-30 20:47:39 25 4
gpt4 key购买 nike

我已经阅读了大量关于正确实现 Equals()GetHashCode() 的文章。我有一些包含许多成员变量的类,我必须为其实现 Equals() 方法。到目前为止,一切都很好。然而,在实现 GetHashCode() 时,我总是难以找到一个好的实现。据我所知,对于某些类,它们永远不会在字典或哈希表中使用,我不想花时间编写一个好的 GetHashCode() 实现,所以我想出了以下虚拟对象“默认”实现:

public override int GetHashCode()
{
Debug.Fail( "If you see this message, implement GetHashCode() properly" );

// Always return the same value for all instances of this class. This ensures
// that two instances which are equal (in terms of their Equals() method)
// have the same hash code.
return 0;
}

如果这是一种可行的方法,我想征求您的意见。

一方面,我不想在不必要的时候花时间实现 GetHashCode()。另一方面,我希望我的代码干净有效。上述实现确保具有相同 Equals() 结果的两个实例也具有相同的哈希码。当然,如果它真的要用作字典中的键,性能会很差。但对于这种情况,您会得到调试断言。

上述方法是否有任何我可能忽略的缺点?

最佳答案

如果您真的不想实现它,我建议您改为抛出异常(例如 NotImplementedException )——这样您就不仅仅依赖于 Debug.Fail 工作了。如果您在生产环境中遇到这种情况,那么快速失败可能是最好的选择。

但老实说,一旦实现了相等性,通常就很容易编写 GetHashCode ( with code like this, perhaps ) - 如果它 em> 很简单,那么这通常表明您的 Equals 方法无论如何都会违反其约定。

请注意 GetHashCode 不只是用于字典 - 如果您尝试根据您的类型的键在 LINQ 中连接两个列表, 也将使用 GetHashCode。基本上,不实现它违反了最小惊讶原则。除非你是 唯一 使用你的代码的人(并且你有完美的内存力或愿意在每次使用该类型时进行检查),否则你应该正确地实现它,IMO。

关于c# - GetHashCode() 虚拟实现(如果不需要),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25647066/

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