我有以下類使用IDisposable取消訂閱事件 - 我是否需要將其他內容放在處置中?
public class Presenter: IDisposable
{
public IView View
{get;private set;}
//snip other object reference, all managed
public Presenter(IView view)
{
View=view;
View.MouseUp += MouseUpEvent;
}
public void MouseUpEvent()
{
//do whatever you want to do on mouse up
}
public void Dispose()
{
View.MouseUp -= MouseUpEvent;
// no more manual disposing
}
}
現在的問題是,我是不是正確地貫徹執行Dispose()
方法?或者我需要手動處理所有其他管理對象,因爲我已經明確定義了Dispose()
?
我認爲即使沒有我手動操作,GC也足夠智能地自行處理(事件訂閱除外)。我對嗎?
我不認爲我需要它。我接受了你對愛因斯坦的回答,因爲我發現你更容易理解(不是每個凡人都能理解愛因斯坦:))。 – Graviton 2010-01-13 07:23:05
即使你沒有專門持有非託管資源,因爲一個子類可能是,而且它不應該是不受限制的,這是我的理解,如果類不是密封的,你應該*有一個終結器(就像Component的情況一樣)必須知道基類是否負責在定稿時調用Dispose(bool)。但就像我說過我正在談論話題。 – Josh 2010-01-13 07:49:26
@Josh:我相信如果你需要在你的類中使用終結器,你應該實現一個並調用Dispose(false)'。無論如何,'Dispose'應該可以多次調用。這比擁有不必要的終結器的類加載要好。終結者現在應該很少見(使用SafeHandle等),但他們有一個真正的性能成本。 – 2010-01-13 08:42:55