2013-03-23 39 views
3

我有以下類:處置類資源

public class MailData : IDisposable 
{ 
    public IDictionary<String, Tuple<Byte[], String>> Attachments { get; set; } 
    public String From { get; set; } 
    public IList<String> To { get; set; } 
    public MailType Type { get; set; } 
} // MailData 

什麼是處置類的正確方法是什麼?

我的意思是,我覺得我應該刪除所有Dictionary ...... Byte[]

什麼其他屬性?

+1

您使用的是什麼非託管資源? – Oded 2013-03-23 13:54:53

回答

4

.NET是一個託管環境,您必須允許垃圾收集器完成它的工作,沒有理由處置簡單的參考類,並且仍然是參考。

通常使用Dispose模式放手的寶貴資源,如文件I/O,各種流,數據庫連接...等

在你的情況然而,沒有必要做任何事情你擁有。

歡迎來到託管世界的C#。

1

你不需要做任何事情,除非你的類也是一次性的,在這種情況下,你會想要處置這個。您不需要清除任何收集,因爲在它們超出範圍之後的一段時間內,它們將與垃圾一起收集。

+2

只有在他們超出範圍之後,他們纔會收集垃圾。 GC會在想到時間處置它們。只要明確這一點。 – Odys 2013-03-23 13:56:42

+0

收集完成後,它們將在收集完成後可用於收集。 – 2013-03-23 13:58:00

0

首先你應該考慮你需要實現什麼方法。 你可以找到一篇有趣的文章here 總結:你應該只在你確實需要的時候實現dispose/finalize,否則它只會減慢GC的速度。在這些方法中,您只需要釋放非託管資源。要詳細瞭解非託管資源,請查看this。 也問你自己:我打算通過調用dispose來顯式釋放非託管資源,或者我要讓GC通過隱式調用Finalize來實現。

希望幫助, Xaser

+0

'IDisposable'可以在沒有終結器的情況下實現,通常也是。這個問題沒有詢問終結者,我也沒有看到假設使用終結者的理由。 – hvd 2013-03-23 14:01:26

1

有什麼是你應該做的,除非MailType有一些非託管資源。在這種情況下,您應該重寫此類的Dispose並調用Dispose的MailType對象。

此外,如果字典中的字節數量很大,則應將該實例包裝在using語句中。

using(var m = new MailData()) 
{ 
    // use the object here 

} // the m.Dispose() gets called here 
+0

如果'MailData'沒有實現'IDisposable',編譯器會拒絕你嘗試使用'using'語句,無論字典需要多少內存。我認爲我同意你在答案中的意思,但我不認爲你確實在說。 :) – hvd 2013-03-23 14:03:50