我想创建所有ViewModel的字典。
public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>();
像这样添加
vmCollection.Add(name, new WeakReference(viewModel));
并调用所需的方法..
((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message);
我需要将其保留为WeakReference
吗?如果我不将其维持为WeakReference
,可能会产生什么后果。
答案 0 :(得分:19)
不使用WeakReference
的唯一后果是,字典中的引用将阻止视图模型实例被垃圾回收。 WeakReference
允许垃圾收集(假设其他地方没有其他固体引用)。
当项目没有引用时,它就有资格进行垃圾回收。 WeakReference
不会创建“可数”引用,因此您可以对其进行引用排序,但如果WeakReference
是唯一留下它的话,仍然可以使其符合条件。< / p>
您是否需要它实际上取决于您的View Models具有的生命周期类型。如果他们需要处置或以其他方式“放弃”,那么您可能需要使用WeakReference
或者公开一种方法来从字典中删除引用。
正如我在评论中提到的那样。我倾向于使用WeakReference
而不是明确地处理相关对象的生命周期。也就是说,当您在相关点上无法查看生命周期时,它们非常有用。我认为在您的情况下,您应该具有必要的可见性,因为这些可能都在UI层中,因此应该尝试不使用它们。
以下是有关该主题的一些资源:
从以上MSDN链接中提取指南:
仅在必要时使用长弱引用作为状态 最终确定后,对象无法预测。
避免使用对小对象的弱引用,因为指针 本身可能大或大。
避免使用弱引用作为内存的自动解决方案 管理问题。相反,为...制定有效的缓存策略 处理应用程序的对象。
我相信最后的指导方针适用于您的情况。
答案 1 :(得分:0)
我采用了稍微不同的方法。
在此示例中,我只有一个单个实例,但是我确信它可以很容易地扩展到多个实例...
因此,在我的课堂上,我创建了以下Action(如果您需要返回某些内容,则可以为Func)。对于我的示例,我只是在推一个Exception:
private static Action<Exception> 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);
}
我没有防守逻辑。