【发布时间】:2011-07-08 12:03:14
【问题描述】:
采取以下措施:
var x = new Action(() => { Console.Write("") ; });
var y = new Action(() => { });
var a = x.GetHashCode();
var b = y.GetHashCode();
Console.WriteLine(a == b);
Console.WriteLine(x == y);
这将打印:
True
False
为什么哈希码相同?
这有点令人惊讶,并且会使在 Dictionary 中使用代表的速度与 List 一样慢(又名 O(n) 用于查找)。
更新:
问题是为什么。 IOW 谁做出了这样一个(愚蠢的)决定?
更好的哈希码实现应该是:
return Method ^ Target == null ? 0 : Target.GetHashcode();
// where Method is IntPtr
【问题讨论】:
-
您是否也尝试将一些代码放入第二个委托,并且仅在检查哈希码之后?
-
不知道为什么会这样,但作为一个想法,您可以实现自己的 Hash 机制,或者将这些操作包装在一个类中并覆盖其 GetHashCode 以满足您的需求。
-
仅供参考,
Delegate.Equals的约定是:“判断指定对象和当前委托是否属于同一类型,是否共享相同的目标、方法和调用列表。” -
@leppie 虽然我必须承认我从来没有遇到过我想在字典中使用委托作为 key 的场景。作为价值,肯定 - 只是不是关键。
-
您的“更好的实现”与我最初犯的错误相同:您正在调用覆盖的
Target.GetHashCode而不是使用引用相等。
标签: c# .net delegates hashcode