我想创建所有 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
,可能会有什么后果.
不使用WeakReference
的唯一后果是字典中的引用将阻止对视图模型实例进行垃圾回收。WeakReference
允许垃圾回收(假设其他地方没有其他可靠的引用)。
当项目没有引用时,该项目将有资格进行垃圾回收。 WeakReference
不会创建"可数"引用,因此您可以保留对它的某种引用,但如果您的WeakReference
是唯一剩下的东西,它仍然有资格查看它。
是否需要它实际上取决于您的视图模型具有什么样的生命周期。如果他们需要处置或以其他方式"放手",那么您可能需要使用 WeakReference
或公开一种方法来从字典中删除引用。
正如我在评论中提到的。我倾向于错误地不使用WeakReference
而不是明确处理相关对象的生命周期。也就是说,当您根本无法了解相关点的生命周期时,它们很有用。我认为在您的情况下,您应该具有必要的可见性,因为这些都可能在 UI 层中,因此应该尽量不使用它们。
以下是有关该主题的资源:
- 弱引用 MSDN 文章
从上述 MSDN 链接中提取的指南:
仅在必要时使用长弱引用作为 对象在定型后不可预测。
避免使用对小对象的弱引用,因为指针 本身可能更大或更大。
避免使用弱引用作为内存的自动解决方案 管理问题。相反,应为 处理应用程序的对象。
我相信最后一点适用于您的情况。
我采取了稍微不同的方法。
对于此示例,我只有一个实例,但我相信它很容易扩展到多个实例......
因此,在我的类上,我创建了以下操作(如果您需要返回某些内容,它可能是 Func)。 对于我的例子,我只是在推动一个异常:
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);
}
我省略了防御逻辑。