WeakReference了解

Lea*_*ner 15 c# wpf weak-references

我想创建所有ViewModel的字典.

   public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>();
Run Code Online (Sandbox Code Playgroud)

像这样添加它

 vmCollection.Add(name, new WeakReference(viewModel));
Run Code Online (Sandbox Code Playgroud)

并调用这样的必需方法..

((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message);
Run Code Online (Sandbox Code Playgroud)

我需要保持它WeakReference吗?如果我不把它作为一个例子,可能会有什么后果WeakReference.

Ada*_*rth 24

不使用a的唯一后果WeakReference是,字典中的引用将阻止View Model实例被垃圾回收.A WeakReference允许垃圾收集(假设其他地方没有其他固体引用).

当一个项目没有引用它时,它就有资格进行垃圾收集.WeakReference不会创建一个"可数"的引用,因此你可以对它进行一种引用,但如果你WeakReference是唯一留下它的东西,仍然可以让它符合条件.

是否需要它实际上取决于View Models的生命周期.如果他们需要处置或以其他方式"放弃",那么您可能需要使用WeakReference或公开一种方法来从字典中删除引用.

正如我在评论中提到的那样.我倾向于错误地使用WeakReference而不是明确地处理相关对象的生命周期.也就是说,当您在相关点上无法查看生命周期时,它们非常有用.我认为在您的情况下,您应该具有必要的可见性,因为这些都可能在UI层中,因此应该尝试使用它们.

以下是有关该主题的一些资源:

从以上MSDN链接中提取的指南:

仅在必要时使用长弱引用,因为在完成后对象的状态是不可预测的.

避免对小对象使用弱引用,因为指针本身可能大或大.

避免使用弱引用作为内存管理问题的自动解决方案.相反,开发一个有效的缓存策略来处理应用程序的对象.

我相信最后的准则点适用于您的情况.

  • @RaoBHavik开销将是`WeakReference`对象实例本身的成本,并且需要不断检查引用的对象是否仍然可用(显然,它可能是自您上次使用它以来收集的).我总是错误地使用它们而不是明确地处理对象的生命周期,但有时你只是没有生命周期的可见性,因此它们可以证明是有用的.我认为在你的情况下你应该具有可见性,所以应该尝试不使用它们. (2认同)