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链接中提取的指南:
仅在必要时使用长弱引用,因为在完成后对象的状态是不可预测的.
避免对小对象使用弱引用,因为指针本身可能大或大.
避免使用弱引用作为内存管理问题的自动解决方案.相反,开发一个有效的缓存策略来处理应用程序的对象.
我相信最后的准则点适用于您的情况.