2010-07-30 89 views
1

我的項目有很多閱讀器和編寫器類。我開始實施IDisposable,但我相信它爲我的課程添加了許多樣板代碼。對於每個類,我需要實現:有什麼辦法可以減少IDisposable的樣板代碼量?

  • 析構函數。
  • Dispose()方法。
  • A Dispose(bool disposing)方法。
  • 「bool disposed」字段。
  • 檢查對象是否已在每個公共方法中處理。
  • 文檔(因爲我啓用了文檔標誌,否則編譯器會發出警告)。

我的問題:

是否值得實現IDisposable?以前,我用我的類,如:

using (Stream s = File.OpenRead("myfile.bin")) 
    x = new SomethingReader(s).ReadSomething(); 

有了IDisposable的,它並沒有太大的改善:

using (SomethingReader r = new SomethingReader(File.OpenRead("myfile.bin"))) 
    x = r.ReadSomething(); 

我只能實現Dispose()方法?

我的類不使用非託管資源,所以Dispose(false)什麼也不做。由於我正在清理的是IDisposable,所以在處理對象之後調用我的方法應該拋出一個ObjectDisposedException,因爲我正在使用一個已經處理過的對象。

如果您建議實施完整的IDisposable模式,是否有任何方法來減少樣板代碼?

編輯:由於一些答案建議封閉班級,我可以證實,實際上封閉班級沒有任何問題。

回答

2

如果你沒有持有非託管資源直接(即連的SafeHandle不直接持有它們),然後在一般:

  • 沒有實現
  • 沒有實現處置終結(bool)
  • 請將您的班級標記爲密封。

這是一個很大的遺憾,多年來所有IDispose廣泛分佈文檔的目的是爲人民寫的Interop庫(即.NET框架作者自己),而完全忽略了一個更普遍的使用模式對於其他人。

情況已有所改善,而且現在有機會通過的FxCop(VS代碼分析),用於密封類型識別的更輕量級的模式:http://msdn.microsoft.com/en-us/library/ms244737%28VS.80%29.aspx

1

如果您不使用非託管資源,則無需實施完整模式。然而,這種模式有一個好處。如果有人想擴展班級,他們可以覆蓋Dispose(bool),然後撥打base.Dispose(true)以確保處理所有資源。

0

你可以從Component假定繼承你並不需要一個不同的基類。但是,如果你沒有做太特別的事情,你可以使用Dispose方法。正如ChaosPandion指出,這可能會導致問題是別人試圖延長你的課程,所以你可能想要密封你的實現。

0

如果有人試圖通過覆蓋Dispose(boolean)來擴展類,並且您尚未實現它,那將會失敗。但是,如果他們嘗試覆蓋Dispose(),那將起作用。如果不指望後代類直接控制任何非託管資源,我認爲沒有任何理由需要密封該類。

相關問題