弱参考理解

本文关键字:参考 | 更新日期: 2023-09-27 18:36:30

我想创建所有 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);
}

我省略了防御逻辑。