2009-04-15 101 views
6

真的希望能夠用某種強制使用using語句的屬性來裝飾我的類,以便該類將始終安全地處理並避免內存泄漏。任何人都知道這樣的技術?是否有可能在C#中強制使用using語句?

+0

怎麼樣在不同的一次性對象嵌入你的對象? – 2009-04-15 10:10:20

+0

使用IDisposable裝飾您的課堂是爲了讓您的課程消費者擁有應該包裝在使用中或稱爲Dispose的標誌。如果您強制執行「使用」技術,則可以有效地向您的好消費者說:「我認爲您太胖了,無法調用Dispose」,並限制使用量。 – 2009-04-15 10:37:33

+0

我也想說,你確定有沒有情況下有人可能想用一種方法創建你的對象,並在另一個方法中處理它? (也許他們也是IDisposable)。你讓別人無法做到這一點。 – 2009-04-15 10:38:57

回答

13

那麼,有一種方法可以做到這一點 - 只允許通過採用委託的靜態方法訪問您的對象。作爲一個非常簡單的例子(如明明有打開文件的許多不同的方式 - 讀/寫等):

public static void WorkWithFile(string filename, Action<FileStream> action) 
{ 
    using (FileStream stream = File.OpenRead(filename)) 
    { 
     action(stream); 
    } 
} 

如果能夠創建自己可支配的對象實例的唯一的事情是在您自己的方法類,你可以確保它們得到適當的使用。誠然,沒有什麼可以阻止委託人獲取參考文獻的副本,並在稍後嘗試使用它,但這不是完全相同的問題。

這種技術嚴重限制了你可以用你的對象做什麼 - 當然 - 但在某些情況下它可能是有用的。

0

如果要確保始終處理對象,請將終結器與IDisposable組合使用。

但在此之前,請閱讀IDisposable和終結器,並意識到通常不需要它們的事實,除非您的類正在管理非託管資源的生命週期。

使用終結器,無論是否包含使用,您的對象都將被「最終」回收。 use語句是IDisposable的一種方便,它允許進行確定性清理。唯一需要注意的是,使用終結器的對象清理起來會更昂貴,而且一般會在等待最終定稿時更長時間地記憶在記憶中。

裁判When do I need to implement a finalizer or IDisposable?technorabble: Using Dispose, Finalizers and IDisposable