在MVVM-light中的Cleanup和Dispose(bool)的区别
在MVVM-light中的Cleanup和Dispose(bool)的区别
在MVVM-light的最新版本(V3 SP1)中,ViewModel类中的\"Dispose()\"和\"Dispose(bool)\"方法都被标注为不再使用,将在将来的版本中被移除。应该使用ICleanup.Cleanup()方法进行清理。这是否意味着所有继承自GalaSoft.MvvmLight.ViewModelBase的ViewModel类都不应该实现IDisposable接口(应该重写清理方法)?如果是这样的话,那就无法使用using语句管理view-model实例了...可能我没有理解清楚...请解释一下...这种清理有什么好处呢?谢谢。
有一个有趣的小故事:发现我的团队中的程序员没有取消订阅事件,于是我对我们的视图模型层次结构进行了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
问题是历史性的。起初,我认为强制所有VM都必须是IDisposable是一个好主意。然而,IDisposable有一个不同的意图:一旦VM被Dispose,它通常会被尽快垃圾回收。和朋友们交谈后,我意识到强制所有VM都必须是IDisposable是一个错误。这就是为什么我用ICleanup替换了IDisposable。ICleanup的目的是提供一种清洗VM的方法(例如将其状态刷新到持久存储中,关闭流等),但不一定以VM尽快垃圾回收的方式。\n\n没有阻止您使VM实现IDisposable。我只是不想在ViewModelBase类中保留此约束,这就是为什么在V4中将删除此接口的原因。\n\n拥有ICleanup的好处是您可以通过ViewModelLocator.Cleanup()的一次调用来清洗所有VM。这是提示VM开发人员说VM应该考虑为其VM提供清理方法的方法。\n\n这有意义吗?\n干杯,\n劳伦特。