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

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

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

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

谢谢。

有帮助吗?

解决方案

参考生存垃圾收集的唯一途径是如果它扎根。如果有一些其他类仍处于包含到的ObservableCollection参考使用,那么的ObservableCollection不会被破坏,无论你是否将其设置为null。例如,假设有“记忆”对象,它是您的收藏之一。你有一所提到它,在你的财产。执行了其他代码行 “的ObservableCollection <> myOtherReference = YourObject.IndexList;”。他们现在有实际的内存对象的引用,太。使你的财产参考空只会消除你的财产的参考;在“myOtherReference”参考未受影响,因为它是现在的内存直接指向,而不是在你的财产。如果你真的想消除记忆这个项目,你需要删除所有引用,或实现某种决定性的“处置”的逻辑,在这一点“myOtherReference”将是一个指向一个释放的对象,并给它的任何调用将抛出一个例外。

其他提示

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

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

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

顺便说一下,很高兴看到您使用 ViewModel。我非常喜欢这种图案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top