MVVM-light中的Cleanup与Dispose(bool)的区别

22
在最新版本的MVVM-light(V3 SP1)中,ViewModel类中的“Dispose()”和“Dispose(bool)”方法都被标记为

不再使用此方法,它将在未来的版本中移除。请改用ICleanup.Cleanup()代替。

这是否意味着所有从GalaSoft.MvvmLight.ViewModelBase派生的ViewModel类都不能实现IDisposable接口(并且必须重写清理)?
如果是,那么using语句就无法用于view-model实例...可能是我理解错了什么...请澄清一下...这样清理的好处是什么?
谢谢。
3个回答

30
问题是历史性的。一开始我认为强制所有的VM都要是IDisposable是个好主意。然而,IDisposable有不同的意图: 一旦VM被Dispose,它(按照约定)应该尽快被垃圾收集。和朋友们交谈后,我意识到强制所有VM都成为IDisposable是一个错误。这就是为什么我用ICleanup替换IDisposable的原因。ICleanup的目的是提供一种清理VM的方法(例如将它们的状态刷新到持久存储器中,关闭流等),但不一定以让它们尽快被垃圾回收的方式清理。
没有什么能阻止你让你的VMs实现IDisposable。我只是不想在ViewModelBase类中保留这个限制,这就是为什么这个接口将在V4中被移除的原因。
ICleanup的好处是,你可以通过一次ViewModelLocator.Cleanup()调用来清理所有的VMs。这是给VM开发者的提示,告诉他们VMs应该考虑为它们的VMs提供清理方法。
这有道理吗? 祝好, Laurent

谢谢你的评论,如果需要在清理后拥有可用的VM,那么这绝对是有意义的... 但我不认为没有释放资源就进行清理的必要性...通常我会在VM关闭时释放资源...为什么需要在未关闭时进行清理呢?期待您的反馈,再次感谢。 - Budda
4
@Budda,我认为LBugnion的意思是,他所使用的IDisposable概念已经过载了,即尽可能快地使用GC来释放对象。然而,我们中的许多人会一遍又一遍地使用同一个VM对象,因此ViewModelBase被赋予了一个ICleanUp接口,其目的是为了清理VM,使其可以再次使用。如果您正在使用VM优先方法,这将非常有用,WPF不会丢弃View然后重新创建它,而是像VM一样进行清理。 - Agies
将我的评论转移到了答案中,这样我就可以更长时间地胡说八道了。 - Luke Puplett

3
一个有趣的小故事:我发现我的团队中的程序员没有取消订阅事件,于是我在我们的视图模型层次结构中使用了IDisposable,但后来我改变了想法,不确定Dispose是否正确。由于MEF和其他一些奇怪的方式创建我们的视图模型,在某些情况下很难调用Dispose,这使我开始怀疑它是否正确。此外,Dispose需要一些细心(和代码片段)才能做到正确: DG Update: Dispose, Finalization, and Resource Management 后来,我在WP7应用上进行了一些周末工作(我使用MVVM Light),注意到Laurent也改变了想法。
我认为这是正确的决定;IDisposable发送了一个信息,即“客户”应该尝试将类的使用包装在using()内或尽快处理实例。
最初,我同意以下线程中的被接受答案,但后来我开始认为JaredPar是正确的。 Using IDisposable to unsubscribe events Luke

2
我认为在这一点上我和Laurent有些不同。IDisposable的理念是对象可能需要进行一些清理,与垃圾回收本身没有任何关系。事实上,大多数情况下,IDisposable是用于清理非托管资源(如文件句柄、同步对象或数据库连接)的,这些资源超出了GC的范围。此外,仅仅因为一个基类实现了IDisposable并不意味着它必须有一个实际的实现。这可以委托给虚拟Dispose(bool disposing)方法,该方法可以被派生类覆盖以执行清理操作。
正如Budda所暗示的那样,问题在于IDisposable通常是单向操作。一旦对象被处理,它应该在其公共方法上抛出ObjectDisposedException异常。如果你想做的只是刷新资源以便重用对象,那么Cleanup方法是有意义的。然而,我不会去除Dispose功能,因为它有不同的目的。

1
非托管资源需要在 Finalize 方法中释放。您还可以在处理程序时强制系统释放它们,并在这种情况下抑制 Finalize(请参见“Dispose”方法的实现模式)。 - Budda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接