使用Silverlight适当实现IDisposable?

时间:2009-01-28 15:07:55

标签: c# .net silverlight idisposable

我正在使用MVVM模式处理Silverlight应用。我的ViewModel目前包含一个表示模型对象集合的属性:

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

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

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

感谢。

2 个答案:

答案 0 :(得分:8)

参考在垃圾收集中存活的唯一方法是它是否已植根。如果还有一些仍在使用的类包含对ObservableCollection的引用,则无论是否将其设置为null,都不会销毁ObservableCollection。例如,假设有一个“内存”对象是您的集合。您的财产中有一个对它的引用。其他一些代码执行“ObservableCollection&lt;&gt; myOtherReference = YourObject.IndexList;”这一行。它们现在也引用了实际的内存对象。使您的属性引用为null将只消除您的属性的引用; 'myOtherReference'引用不受影响,因为它现在直接指向内存,而不是您的属性。如果你真的想要从内存中删除这个项目,你需要删除所有引用,或者实现一些决定性的'dispose'逻辑,此时“myOtherReference”将是一个指向被处置对象的指针,并且对它的任何调用都会抛出一个例外。

答案 1 :(得分:3)

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

Finding Memory Leaks in WPF Applications

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

很酷,看到你使用ViewModel。我是这种模式的忠实粉丝。