2

我正在使用 MVVM 模式开发 Silverlight 应用程序。我的 ViewModel 当前包含一个表示模型对象集合的属性:

public ObservableCollection<IndexEntry> IndexList
        {
            get;
            set;
        }

它还有几种方法可以使用从 Web 服务返回的数据填充该集合。

由于此类的实例可能在应用程序运行时创建和销毁,我应该实现IDisposable并将属性的引用设置为 null 还是该类的销毁足以删除对集合 tis 属性引用的所有引用?是否有任何警告可能会留下参考?

谢谢。

4

2 回答 2

8

引用在垃圾回收中幸存的唯一方法是它是否有根。如果还有其他仍在使用的类包含对 ObservableCollection 的引用,那么 ObservableCollection 将不会被销毁,无论您是否将其设置为 null。例如,假设有一个“内存中”对象是您的集合。在您的财产中,您对它有一个引用。其他一些代码执行“ObservableCollection<> myOtherReference = YourObject.IndexList;”行。他们现在也有对实际内存对象的引用。将您的属性引用设为 null 只会消除您的属性引用;'myOtherReference' 引用不受影响,因为它现在直接指向内存,而不是您的属性。

于 2009-01-28T15:23:11.253 回答
3

GWLlosa 恰到好处。此外,Silverlight 数据绑定将保持您的 ViewModel 固定,只要您有对它的 Binding 引用。换句话说,您需要从视图的 DataContext 中删除您的 ViewModel(通过设置 View.DataContext=null),或者您的视图需要在您的 ViewModel 发布之前从可视化树中删除。实施 IDisposable 无济于事,我不会为此推荐它。IDisposable 旨在清理非托管资源或更好地控制您的托管资源处置。在这种情况下,如果您正确理解绑定和引用的工作原理并让垃圾收集器处理这些事情,则没有必要。这篇文章可以帮助:

在 WPF 应用程序中查找内存泄漏

它主要是 WPF,但您也可以使用 Silverlight 上的技术。

顺便说一句,很高兴看到您使用 ViewModel。我是这个模式的忠实粉丝。

于 2009-01-28T15:54:58.647 回答