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); } 

我遗漏了防守逻辑。