WeakReference了解
我想创建所有ViewModel的字典。
public static Dictionary vmCollection = new Dictionary();
像这样添加它
vmCollection.Add(name, new WeakReference(viewModel));
并调用这样的必需方法..
((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message);
我是否需要将其维护为WeakReference
? 如果我不将它作为WeakReference
维护,可能会产生什么后果。
不使用WeakReference
的唯一后果是,字典中的引用将阻止View Model实例被垃圾回收。 WeakReference
允许垃圾收集(假设其他地方没有其他固体引用)。
当一个项目没有引用它时,它就有资格进行垃圾收集。 WeakReference
不会创建“可数”引用,因此您可以保留对它的引用类型,但如果您的WeakReference
是唯一留下它的东西,它仍然可以使它符合条件。
是否需要它实际上取决于View Models的生命周期。 如果他们需要处理或以其他方式“放弃”,那么您可能需要使用WeakReference
或公开一种方法来从字典中删除引用。
正如我在评论中提到的那样。 我倾向于使用WeakReference
而不是明确地处理相关对象的生命周期。 也就是说,当您在相关点无法查看生命周期时,它们非常有用。 我认为在您的情况下,您应该具有必要的可见性,因为这些都可能在UI层中,因此应该尝试不使用它们。
以下是有关该主题的一些资源:
- 弱参考 – 何时以及如何使用它们
- 弱引用MSDN文章
从以上MSDN链接中提取的指南:
仅在必要时使用长弱引用,因为在完成后对象的状态是不可预测的。
避免对小对象使用弱引用,因为指针本身可能大或大。
避免使用弱引用作为内存管理问题的自动解决方案。 相反,开发一个有效的缓存策略来处理应用程序的对象。
我相信最后的准则点适用于您的情况。
我采取了略微不同的方法。
对于这个例子,我只有一个实例 ,但我确信它对于多个实例来说相当容易扩展…
所以,在我的课上我创建了以下Action(如果你需要返回它,它可能是一个Func)。 对于我的例子,我只是推动一个例外:
private static Action StaticAccessorToInstanceMethod { get; set; }
我要调用的实例方法是:
public void HandleExceptionDetails(Exception e) { // Content of the method on the instance }
然后我在我的构造函数中有这个:
StaticAccessorToInstanceMethod = this.HandleExceptionDetails;
以下是析构函数:
StaticAccessorToInstanceMethod = null;
(如果您正在处理多个实例,那么构造函数和析构函数代码会有所不同)。
然后静态方法只调用实例方法:
public static void HandleGeneralException(Exception ex) { StaticAccessorToInstanceMethod(result); }
我遗漏了防守逻辑。