16

我想创建所有 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.

4

2 回答 2

30

不使用 a 的唯一后果WeakReference是字典中的引用将阻止 View Model 实例被垃圾收集。AWeakReference允许垃圾收集(假设其他地方没有其他可靠的引用)。

当一个项目没有对它的引用时,它就有资格进行垃圾回收。不会创建“可数”引用,因此您可以保留对它的某种引用,但如果您是唯一剩下的人,WeakReference则仍然让它符合条件。WeakReference

你是否需要它真的取决于你的视图模型有什么样的生命周期。如果他们需要处置或以其他方式“放手”,那么您可能需要使用WeakReference或公开一种方法来从字典中删除引用。

正如我在评论中提到的。我倾向于避免使用WeakReference,而不是明确地处理相关对象的生命周期。也就是说,当您根本不了解相关点的生命周期时,它们很有用。我认为在您的情况下,您应该具有必要的可见性,因为这些都可能在 UI 层中,因此应该尽量使用它们。

这是有关该主题的资源:

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

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

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

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

我相信最后一个指导点适用于您的情况。

于 2012-06-07T08:38:20.720 回答
0

我采取了稍微不同的方法。

对于这个例子,我只有一个实例,但我确信它可以很容易地扩展到多个实例......

因此,在我的课堂上,我创建了以下操作(如果您需要返回某些东西,它可能是一个 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);
}

我忽略了防守逻辑。

于 2018-10-29T11:10:33.090 回答