2013-03-23 38 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