【发布时间】:2013-08-06 15:55:27
【问题描述】:
我的search for a helper to correctly combine constituent hashcodes for GetHashCode() 似乎引起了一些敌意。我从 cmets 得到的印象是,一些 C# 开发人员认为您不应该经常覆盖 GetHashCode() - 当然,有些评论者似乎认为帮助获得正确行为的库是无用的。对于Java community to ask for it to be added to the JDK,这样的功能在Java 中被认为足够有用,它是now in JDK 7。
在 C# 中你不需要——或者绝对不应该——像在 Java 中那样频繁地覆盖 GetHashCode()(相应地,Equals())是否有一些根本原因?我发现自己经常使用 Java 执行此操作,例如,每当我创建一个我知道我想保留在 HashSet 中的类型或用作 HashMap 中的键(等效于 .net Dictionary)时。
【问题讨论】:
-
在创建表示值的类型时应该重写 GetHashCode()。
-
@Slaks 例如
int、double和Point? -
@HighCore:
Dictionary<,>是一种非常有用的类型……并不是说它是覆盖 Equals/GetHashCode 的唯一用途。能够创建一组不同的元素通常也很有用。正如您所暗示的那样,我认为没有任何理由建议 OP 过度使用字典。 -
删除了我的答案,但有两个想法:在 .NET 中,您 需要 实现这一点的情况是一小部分的一小部分 - 所以“为什么不呢? "是“因为你不需要”。但它似乎也可能与可变性/不变性密切相关; .NET 对象通常是可变的,可变类型上的自定义 GetHashCode 实现可能很危险
-
@bacar:实际上,值类型对
GetHashCode()的实现非常糟糕。见msdn.microsoft.com/en-us/library/ms182276.aspx