我需要为对象分配一个 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 - 谢谢大家,最后要使用弱引用