2015-02-12 101 views
2

我們可以使用Dispose方法而不實現IDisposable接口嗎?我們可以使用Dispose方法而不實現IDisposable接口嗎?

+0

你可以將一個方法命名爲Dispose並且沒有任何限制地使用它,但是如果你想使用()'語法你必須實現'IDisposable' – 2015-02-12 06:51:24

+0

是否有什麼特別的原因你不想實現' IDisposable'?在問這個問題之前,你是否嘗試過編譯它? – Gusdor 2015-02-12 08:28:31

+0

我的問題是我們可以調用IDisposable接口的Dispose方法而不實現接口。例如,對於Connection對象,我們稱之爲Con.Dispose? – 2015-03-26 08:34:02

回答

0

即使您未執行IDisposable,管理對象也會自動處理,IDisposable允許您處理哪些運行時不會像處理文件一樣處理,打開處理非託管代碼組件。

Implementing a Dispose Method

用於處置的對象的模式,被稱爲一個dispose圖案, 上的對象的生存期施加順序。處理模式爲 ,僅用於訪問非託管資源的對象,如文件 和管道句柄,註冊表句柄,等待句柄或指向 非託管內存塊的指針。這是因爲垃圾收集器 在回收未使用的管理對象時非常高效,但無法回收非管理對象。

如果你不想使用IDisposable模式,並希望有自己的話,我相信,因爲它一會要找出可能明顯使用了IDisposable是不推薦的方法。

2

可以命名一個方法Dispose,並用它作爲一個普通的方法沒有任何限制:

public class MyClass { 
    public void Dispose() { 
    ... 
    } 
} 
... 

// using() emulation 
MyClass m = null; 

try { 
    m = new MyClass(); 
    ... 
} 
finally { 
    if (m != null) 
    m.Dispose(); 
} 

但如果你想using()語法,你必須實施IDisposable

public class MyNextClass: IDisposable { 
    protected virtual void Dispose(Boolean disposing) { 
     ... 
    } 

    public void Dispose() { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
    } 
    ... 
    // compare this with the using() emulation in the code above 
    using (MyNextClass n = new MyNextClass()) { 
    ... 
    } 

無論如何,即使它是可能來命名一個方法Dispose這不是一個好的p ractice surprize(並最終刺激)開發人員(包括你)誰讀你的文本;因此要麼實施IDisposable或找到其他一些名稱爲的方法。

0

沒有人會阻止你做這件事,但它是非常糟糕的設計,因爲每個人都知道這個無可爭議的接口。如果你給這種方法有不同的含義,那麼你將設計混淆爲誰以後再看看你的代碼。也許即使你自己在幾年內不記得你爲什麼這樣做的原因。

相關問題