[英]Converting Object.GetHashCode() to Guid
我需要为应用程序启动和关闭时管理状态的对象分配一个guid看起来我可以使用字典将查找值存储在字典中
dictionary<int,Guid>.Add(instance.GetHashCode(), myGUID());
这里有什么潜在的问题需要注意吗?
这不需要在执行运行之间持续存在,只需要像这样的guid
在应用程序终止之前,gethashcode()和查找guid以更新()或插入()到持久性引擎USING GUID
唯一的假设是gethashcode()在进程运行时保持一致
在相同的对象类型(从窗口派生)上调用gethashcode()
List<WeakReference>
希望上面说清楚。
所以现在的问题是 - 为什么不只是存储HashCode(仅用户控件)而不是WeakReference
并在通过列表迭代时消除空引用的测试
更新3 - 谢谢所有,最后将使用弱引用
您似乎假设哈希码是唯一的。 散列码不起作用。 有关更多详细信息,请参阅Eric Lippert 关于GetHashCode指南和规则的博客文章,但基本上您应该只为保持良好行为的类型做出假设 - 即如果两个对象具有不同的哈希码,则它们肯定是不相等的。 如果它们具有相同的哈希码,则它们可能相等,但可能不相同。
编辑:如上所述,您也不应该在执行运行之间保留哈希码。 面对重启,无法保证他们会保持稳定。 目前还不是很清楚你正在做什么,但这听起来不是一个好主意。
编辑:好的,你现在已经注意到它不会持久,所以这是一个好的开始 - 但你仍然没有处理哈希码冲突的可能性。 你为什么要调用GetHashCode()
? 为什么不添加对字典的引用?
使用GetHashCode来平衡哈希表 。 这就是它的用途。 不要将它用于其他非设计用途的目的; 那很危险
快速简便的修复似乎是
var dict = new Dictionary<InstanceType, Guid>();
dict.Add(instance, myGUID());
当然,如果还没有正确实现InstanceType.Equals。 (或实现IEQuatable<InstanceType>
)
我能想到的可能问题:
注 - Jon更优雅地说( 见上文 )
由于这是针对WPF控件的,为什么不将Guid添加为依赖项预测呢? 您似乎已经在迭代用户控件,以获取其哈希码,因此这可能是一个更简单的方法。
如果你想捕获一个控件被删除以及它有哪个Guid,那么订阅关闭/删除事件的一些管理器对象只是存储Guid和其他一些细节将是一个好主意。 然后,如果需要,您还可以更轻松地捕获更多详细信息以进行分析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.