接口IDisposable
的目的是以有序的方式釋放非託管資源。它與using
關鍵字緊密相關,該關鍵字定義了一個範圍,在該範圍之後將討論所涉及的資源。是否濫用IDisposable從「使用」聲明中受益?
由於這種機制非常整齊,我一再試圖讓班級實施IDisposable
,以便能夠以非預期的方式濫用此機制。例如,一個可以實現類來處理嵌套的背景是這樣的:
class Context : IDisposable
{
// Put a new context onto the stack
public static void PushContext() { ... }
// Remove the topmost context from the stack
private static void PopContext() { ... }
// Retrieve the topmost context
public static Context CurrentContext { get { ... } }
// Disposing of a context pops it from the stack
public void Dispose()
{
PopContext();
}
}
在調用代碼可能是這樣的用法:
using (Context.PushContext())
{
DoContextualStuff(Context.CurrentContext);
} // <-- the context is popped upon leaving the block
(請注意,這只是一個例子,而不是到這個問題的主題)
Dispose()
在離開聲明範圍時被調用的事實也可以被利用來實現各種依賴於範圍的事情,例如計時器。這也可以通過使用try ... finally
結構來處理,但是在那種情況下,程序員將不得不手動調用一些方法(例如Context.Pop
),其中using
構造可以爲此做。
IDisposable
的這種用法並不符合其預期用途as stated in the documentation,但誘惑依然存在。
是否有具體的理由來說明這是一個糟糕的主意,並永遠拋棄我的幻想,例如垃圾回收,異常處理等等的複雜性。或者我應該繼續前進並放縱自己,以這種方式濫用這種語言概念?
有很多其他的概念可能會被濫用,上面是其中的一個,唯一的問題是**可讀性**,請記住您的代碼應該清晰/可讀並且可以由其他開發人員維護。 – Habib
我同意Habib。總是想想這個可憐的混蛋,從現在開始的18個月裏,你將不得不使用你的代碼。有一個很好的機會,混蛋將是你:-) –
這是一個主觀的問題,但你可以注意到,ASP.NET MVC框架濫用IDisposable這種方式 - 例如'FormExtensions.BeginForm' – Joe