2

我需要为对象分配一个 guid 以在应用程序启动和关闭时管理状态看起来我可以使用将查找值存储在字典中

dictionary<int,Guid>.Add(instance.GetHashCode(), myGUID());

这里有什么潜在的问题需要注意吗?

笔记

这不需要在执行运行之间持续存在,只有这样的 guid

  • 创建对象
  • gethashcode(),与新的或旧的 guid 关联
  • 在应用程序终止之前,gethashcode() 和查找 guid 以 update() 或 insert() 到持久性引擎中使用 GUID

    唯一的假设是 gethashcode() 在进程运行时保持一致

    还在同一对象类型上调用 gethashcode()(从窗口派生)

更新 2 - 这是更大的图景

  • 在运行之间创建一个状态机来存储有关 WPF 用户控件(后来称为 UC)的信息
  • 用户控件的类型可以随时间变化(添加/删除)
  • 在第一次运行中,没有先前的状态,用户与 UC 的一个子集进行交互并修改他们的状态,这需要在应用程序重新启动时重新创建
  • 此状态快照是在应用程序正常关闭时拍摄的
  • 也可以有多个 UC 类型的实例
  • 在关闭时,每个实例都被分配一个 guid 并与类型信息和状态信息一起保存
  • 所有这些 guid 也存储在一个集合中
  • 重新启动时,对于每个 guid,创建对象,存储 ref/guid,恢复每个实例的状态,以便应用程序看起来与以前完全相同
  • 用户可以添加或删除 UC 实例/类型,并以其他方式与系统交互
  • 关机时,再次保存状态
  • 此时的选择是删除/删除所有先前的状态并将新的状态信息插入持久层(sql db)
  • 随着时间的推移观察/分析,事实证明许多实例保持一致/静态并且不会改变 - 因此它们的状态不需要再次删除/插入,因为状态信息现在非常大并且存储在非本地数据库中
  • 所以只保留更改增量
  • 要计算增量,需要跟踪参考生命周期
  • 当前存储为List<WeakReference>启动时
  • 关机时,遍历此列表和屏幕上的实际 UC,相应地添加/更新/删除键
  • 将增量发送到持久性

希望以上说明清楚。

所以现在的问题是 - 为什么不只存储 HashCode (仅限用户控件)而不是WeakReference在遍历列表时消除空引用的测试

更新 3 - 谢谢大家,最后要使用弱引用

4

5 回答 5

8

使用 GetHashCode 来平衡哈希表。这就是它的用途。请勿将其用于其他非设计用途;那很危险。

于 2011-12-06T07:23:53.067 回答
8

您似乎假设哈希码是唯一的。哈希码不是这样工作的。有关更多详细信息,请参阅 Eric Lippert关于 GetHashCode 指南和规则的博客文章,但基本上您应该只对行为良好的类型做出保证 - 即如果两个对象具有不同的哈希码,它们肯定是不相等的。如果它们具有相同的哈希码,它们可能相等,但可能不相等。

编辑:如前所述,您也不应该在执行运行之间保留哈希码。无法保证它们在重新启动时会保持稳定。目前还不清楚你在做什么,但这听起来不是一个好主意。

编辑:好的,您现在已经注意到它不会持久,所以这是一个好的开始 - 但您仍然没有处理哈希码冲突的可能性。你为什么要打电话GetHashCode()?为什么不直接添加对字典的引用?

于 2011-12-05T16:33:19.757 回答
2

快速简便的修复似乎是

var dict = new Dictionary<InstanceType, Guid>();
dict.Add(instance, myGUID());

当然,如果还没有,您需要正确实现 InstanceType.Equals。(或实施IEQuatable<InstanceType>

于 2011-12-05T16:44:31.753 回答
0

我能想到的可能问题:

  • 哈希码冲突可能会给您重复的字典键
  • 不同对象的哈希算法可以为两个功能不同的对象提供相同的哈希码;你不会知道你正在使用哪个对象
  • 这种实现容易产生歧义(如上所述);您可能需要存储有关对象的更多信息,而不仅仅是它们的哈希码。

注意-乔恩说得更优雅(见上文

于 2011-12-05T16:34:14.703 回答
0

由于这是针对 WPF 控件的,为什么不将 Guid 添加为依赖项属性呢?您似乎已经在遍历用户控件,以获取他们的哈希码,所以这可能是一种更简单的方法。

如果您想捕获某个控件已被删除以及它具有哪个 Guid,则订阅关闭/删除事件并仅存储 Guid 和其他一些细节的管理器对象将是一个好主意。如果需要,您还可以更轻松地捕获更多详细信息以进行分析。

于 2011-12-06T20:02:35.160 回答