我需要为应用启动时管理状态的对象分配一个guid&关掉 看起来我可以使用
将查找值存储在字典中dictionary<int,Guid>.Add(instance.GetHashCode(), myGUID());
这里有什么潜在的问题需要注意吗?
这不需要在执行运行之间持续存在,只需要像这样的guid
在app终止之前,gethashcode()和查找guid到update()或insert()到持久性引擎USING GUID
唯一的假设是gethashcode()在进程运行时保持一致
同样的对象类型(从窗口派生)调用gethashcode()
List<WeakReference>
希望上面说清楚。
所以现在的问题是 - 为什么不直接存储HashCode(仅限用户控件)
而不是WeakReference
并且消除了空引用的测试
通过列表迭代
更新3 - 感谢所有,最后使用弱引用
答案 0 :(得分:8)
您似乎假设哈希码是唯一的。散列码不起作用。有关更多详细信息,请参阅Eric Lippert关于Guidelines and rules for GetHashCode的博客文章,但基本上您应该只为保持良好行为的类型做出假设 - 即如果两个对象具有不同的哈希码,则它们肯定是不相等的。如果它们具有相同的哈希码,则它们可能相等,但可能不是。
编辑:如上所述,您也不应在执行运行之间保留哈希码。面对重启,无法保证他们会保持稳定。它并不是很清楚你正在做什么,但这听起来不是一个好主意。
编辑:好的,你现在已经注意到它不会持久化,所以这是一个好的开始 - 但你仍然没有处理哈希码冲突的可能性。你为什么要打电话给GetHashCode()
?为什么不直接添加对字典的引用?
答案 1 :(得分:8)
使用GetHashCode来平衡哈希表。这就是它的用途。不要将它用于其他非设计用途的目的;那很危险
答案 2 :(得分:2)
快速简便的解决方案似乎是
var dict = new Dictionary<InstanceType, Guid>();
dict.Add(instance, myGUID());
当然,如果还没有正确实现InstanceType.Equals。 (或实施IEQuatable<InstanceType>
)
答案 3 :(得分:0)
我能想到的可能问题:
注意 - Jon更优雅地说(see above)
答案 4 :(得分:0)
由于这是针对WPF控件的,为什么不将Guid添加为依赖项预测呢?您似乎已经在遍历用户控件,以获取其哈希码,因此这可能是一种更简单的方法。
如果你想捕获一个控件被删除以及它有哪个Guid,那么订阅关闭/删除事件的一些管理器对象只是存储Guid和其他一些细节将是一个好主意。然后,如果需要,您还可以更轻松地捕获更多详细信息以进行分析。