【问题标题】:Dispose Class Resources处理类资源
【发布时间】:2013-03-13 07:45:34
【问题描述】:

我有以下课程:

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[] ...

其他属性呢?

【问题讨论】:

  • 你在使用哪些非托管资源?

标签: c#


【解决方案1】:

.NET 是一个托管环境,您必须允许垃圾收集器完成它的工作,您没有理由处理简单的引用类,byte[] 仍然是一个引用。

通常您使用Dispose 模式来释放有价值的资源,例如文件 I/O、各种流、数据库连接...等

但是,就您而言,您无需自己做任何事情。

欢迎来到 C# 的托管世界。

【讨论】:

    【解决方案2】:

    你不需要做任何事情,除非你的 MailType 类也是一次性的,在这种情况下你会想要处理它。您无需清除任何集合,因为它们会在超出范围后的某个时间连同其内容一起被垃圾回收。

    【讨论】:

    • 它们在超出范围后不会被垃圾回收。 GC 会在认为时机成熟的时候处理掉它们。只是说清楚。
    • 它们超出范围后将可供收集,何时进行收集取决于 GC。
    【解决方案3】:

    除非MailType 有一些非托管资源,否则您无需执行任何操作。在这种情况下,您应该重写该类的 Dispose 并调用 MailType 对象的 Dispose。

    此外,如果字典中的字节数很大,您应该将实例包装在 using 语句中。

    using(var m = new MailData())
    {
       // use the object here
    
    } // the m.Dispose() gets called here
    

    【讨论】:

    • 如果MailData 没有实现IDisposable,无论字典占用多少内存,编译器都会拒绝您使用using 语句的尝试。我想我同意你在回答中试图说的话,但我认为你实际上并没有这么说。 :)
    【解决方案4】:

    首先你应该考虑你需要实现什么方法。 你可以找到一篇有趣的文章here 总结:你应该只在真正需要它们时才实现 dispose / finalize,否则只会减慢 GC 的速度。在这些方法中,您只需要释放非托管资源。要了解有关非托管资源的更多信息,请查看 this。 还要问自己:我是要通过调用 dispose 来显式释放非托管资源,还是要让 GC 通过隐式调用 Finalize 来完成。

    希望对您有所帮助, 赛赛尔

    【讨论】:

    • IDisposable 也可以为没有终结器的类实现,而且通常是这样。这个问题没有询问终结器,我没有看到假设使用终结器的理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多