2010-06-03 22 views
21

在MVVM光的最新版本(V3 SP1)兩者 「處置()」 和 「處置(布爾)」 在ViewModel類的方法被標記清理VS的Dispose(布爾)在MVVM光

不要再使用這種方法,它將在未來版本中被刪除。使用ICleanup.Cleanup(),而不是

這是否意味着IDisposable接口不能在從GalaSoft.MvvmLight.ViewModelBase派生的所有視圖模型類實現(和清理必須overrided)?

如果是的話,使用不能用於視圖模型實例...可能我不明白的東西...請澄清...這種清理有什麼好處?

謝謝。

回答

27

問題是歷史。起初我認爲強制所有虛擬機成爲IDisposable是個好主意。但是,IDisposable有一個不同的意圖:一旦虛擬機被處置,預計(按慣例)它將盡快被垃圾收集。在與朋友交談之後,我意識到迫使所有虛擬機成爲IDisposable是一個錯誤。這就是爲什麼我用ICleanup替換了IDisposable。 ICleanup的目的是提供一種清理虛擬機的方法(例如,將其狀態刷新爲持久存儲,關閉流等),但不一定會以儘可能快的方式進行垃圾回收。

沒有什麼能夠阻止你讓虛擬機實現IDisposable。我只是不想在ViewModelBase類中保留這個約束,這就是爲什麼這個接口將會在V4中被移除。

擁有ICleanup的好處是您可以在ViewModelLocator.Cleanup()的一次調用中清理所有虛擬機。虛擬機開發人員表示虛擬機應該考慮爲其虛擬機提供清理方法,這是一個暗示。

這有道理嗎? 乾杯, Laurent

+0

謝謝你的評論,它絕對讓SENCE,如果你需要它的clening後有可行的VM ......但我不明白了一個道理把它清理乾淨不用設置。 ..通常我正在關閉虛擬機......爲什麼我需要清理它而不關閉? 我將不勝感激任何反饋。再次感謝。 – Budda 2010-06-04 20:45:15

+4

@Budda我相信LBugnion所說的是,他爲IDisposable使用的概念已經超載了GC的想法儘快的對象。然而,我們很多人一次又一次地使用同一個VM對象,所以不是拋棄對象ViewModelBase,而是給出了一個ICleanUp接口,其目的是爲了清除VM Clean,以便它可以再次使用。如果你是在做一個虛擬機第一種方法,這會很有用,WPF不會拋棄View並重新創建它,而是像VM一樣清理它。 – Agies 2010-06-05 03:13:08

+0

謝謝。現在清楚了 – Budda 2010-06-06 19:11:21

2

我想我在這一點上與Laurent有所不同。 IDisposable背後的想法是,對象可能需要進行一些清理工作,而且本身與垃圾收集沒有任何關係。實際上,大多數時間IDisposable的實現是爲了清理非託管資源,例如文件句柄,同步對象或數據庫連接,它們不在GC的範圍之內。此外,僅僅因爲基類實現了IDisposable並不意味着它必須有一個實際的實現。這可以歸結爲虛擬Dispose(布爾處置)方法,可以由派生類重寫,以便他們可以執行清理。

Budda暗示的問題是IDisposable按慣例是單向操作。一旦一個對象被處置,它應該在其公共方法上拋出一個ObjectDisposedException。如果你想要做的只是清理資源,以便重用對象,那麼清理方法是有意義的。但是,我不一定會刪除用於不同目的的Dispose功能。

+1

需要在Finalize方法中釋放非託管資源。在這種情況下,您也可以強制系統在處置期間釋放它們並壓制finalize(請參閱「Dispose」方法的實現模式) – Budda 2011-03-15 16:26:31

2

「有趣的」小故事:在我的團隊中發現程序員沒有退訂事件,我'洗'IDisposable下我們的視圖模型層次結構只是爲了改變我的想法,關於Dispose是否是正確的地方。

在某些情況下,由於MEF和其他一些我們創建視圖模型的奇怪方式,很難調用Dispose。這讓我想知道它是否正確。然後還有那個處置需要一些護理的事實(和片斷),以獲得正確的:

DG Update: Dispose, Finalization, and Resource Management

後來,我做了一個WP7應用中的一些週末的工作(在這裏我使用MVVM光),發現Laurent的變化的心也是如此。

我認爲它是正確的決定; IDisposable會發送一條消息,指示「客戶」應該嘗試使用using()函數來包裝類的用法,或者以其他方式儘快清洗實例。

最初,我同意接受的答案在下面的線程,但後來我開始認爲JaredPar是正確的。

Using IDisposable to unsubscribe events

盧克