【问题标题】:Garbage Collection dispose of Datatable array in c#垃圾收集处理 C# 中的 Datatable 数组
【发布时间】:2010-11-07 11:58:13
【问题描述】:

我是 GC 的新手, 如果我想释放一个数据表数组,在它的所有数据表上调用 dispose() 就足够了吗?我是否也需要将 null 设置为 databale 数组?还是每个数据表?

这就够了吗?:

 DataTable[] myTables = null;
             try
             {
                 myTables = DB.GetTables();

                 // use myTables....
             }
             finally
             {
                 // Dispose Data Tables
                 if (myTables != null)
                 {
                     foreach (DataTable dt in myTables)
                     {
                         if (dt != null)
                             dt.Dispose();
                     }
                 }
             }

【问题讨论】:

  • 垃圾收集器在处理应用程序时被调用

标签: .net arrays garbage-collection datatable dispose


【解决方案1】:

对于垃圾回收,您必须什么都不做

由于 DataTable 实现了 IDisposable,因此最好在所有这些上调用 Dispose()(就像您正在做的那样)。仅在极少数情况下才需要设置对null 的引用。不在这里。

但是Dispose() 是关于释放托管和非托管资源,而不是关于垃圾收集。
对于 DataTbales Dispose() 实际上并不是必需的,但您不想费心知道这一点。如果一个类有一个 Dispose() 成员,则调用它。

【讨论】:

  • 这对我来说就像“如果你做任何事情,比如处理东西或将其清空,GC 就会中断”。就像,就像要求你不要碰任何东西一样。仅供参考。
  • @Chao,我正在添加更多文本。
  • 释放实现 IDisposable 的对象是一种很好的常规做法,即使使用垃圾收集器也是如此。
  • @Chao:对于 GC,这是真的。
  • @rodniko:GC 稍后会回收它们。
【解决方案2】:

不,你不需要再做任何事情了。

垃圾收集器知道数组何时不再被使用,并且从代码中的那个点开始,它可以收集数组以及其中的所有内容。将数组引用或任何数据表引用设置为 null 只是不必要的工作。

【讨论】:

    【解决方案3】:

    垃圾收集是一个非常昂贵的过程,这就是为什么微软决定自动化它,以便在系统有空闲容量运行它或资源变得太低时运行它。

    因此,作为一般经验法则,您只需在使用非托管对象(例如 COM 引用)或遇到性能问题并且发现手动垃圾收集可以提供帮助时,才需要担心显式垃圾收集.

    【讨论】:

    • 在 .net 世界中,唯一的“手动垃圾收集”是直接调用 GC.Collect(),而且几乎没有理由这样做。您可能指的是一次性用品,在这种情况下您可能需要提及。
    • 感谢 cHao。完全同意你的看法。也许我错了,但是当我第一次回答这个问题时,我并没有看到“一次性”这个词,我简洁的回答只关注 GC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多