gpt4 book ai didi

c# - 在 C# 字典 : no-no? 中使用基线对象 GetHashCode

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:51 25 4
gpt4 key购买 nike

我正在尝试将 .Net 库与由 API 类的多个实例生成的异步回调一起使用,一旦在我的事件处理程序中,我需要找到这个特定事件来自哪个实例,以及我的所有拥有有关其上下文的信息。

第一部分很简单,因为回调的第一个参数将是发送通知的对象,只需要转换。但现在我一直在寻找一种方法将它与我自己的数据相关联,因为该对象几乎没有公共(public)属性来标识实例。

此刻,我宣布...

Dictionary<TheDotNetClass,MyClass> 

..它看起来工作正常,但我怀疑它只是使用通用的 Object.getHashCode/compare 并且它可能远非安全,可能会随着时间的推移而改变,会导致太多的碰撞,等等。

然而,我想不出任何替代方法可以帮助我将获得的通用对象与我这边与该 API 实例相关联的所有元数据联系起来。

我是不是忽略了什么?我正在做的事情是否足够安全以进行扩展?谢谢!

最佳答案

默认的EqualsGetHashCode 是基于引用相等的。如果对象没有覆盖 EqualsGetHashCode(您可以使用像 dotPeek 这样的反编译器来验证),那么每个对象实例都将是一个唯一的字典键,所以是的,您可以使用 Dictionary 将额外数据附加到每个实例。这是一个相当常见的场景,并且完全受支持 - 您正在按设计使用它。

我不会担心哈希冲突。 BCL 团队很聪明;他们将基础 GetHashCode 设计为用作哈希键,因此冲突应该是最小的。

编辑:这是一个代码片段,显示散列码不是基于对象的地址。压缩后,b的地址会改变,但注意它的哈希码不会。

var a = new object();
var originalHashCodeA = a.GetHashCode();
for (var i = 0; i < 10000; ++i)
new object();
var b = new object();
var originalHashCodeB = b.GetHashCode();

// Synchronous garbage collection (see http://stackoverflow.com/q/748777/87399)
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

Console.WriteLine(a.GetHashCode() == originalHashCodeA);
Console.WriteLine(b.GetHashCode() == originalHashCodeB);

请注意,输出为 TrueTrue。在垃圾收集和压缩之后,两个对象的哈希码都没有改变。所以是的,默认的 GetHashCode 在压缩过程中是安全的。

关于c# - 在 C# 字典 : no-no? 中使用基线对象 GetHashCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23463487/

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