可以创建许多内存密集型对象,然后放弃对它们的引用。例如,我可能想从数据库中下载某些数据并对其进行操作,我将进行100次单独的下载和处理迭代。我可以一次声明一个DataTable变量,然后对于每个查询,使用构造函数将其重置为新的DataTable对象,放弃内存中的旧DataTable对象。

DataTable类具有轻松的内置方式来释放其使用的内存,包括Rows.Clear()和.Dispose()。因此,我可以在每次迭代结束时执行此操作,然后再将变量设置为新的DataTable对象。否则,我可能会忘记它,而让CLR垃圾收集器为我做这件事。垃圾收集器似乎非常有效,因此两种方法的最终结果应该相同。在不需要大量内存的对象时(最好添加代码来做到这一点),还是仅仅依靠垃圾收集器为您完成所有工作(是您的摆布),是“更好”的做法吗? GC算法,但是您的代码较小)?

根据要求,以下代码说明了回收的DataTable变量示例:

    // queryList is list of 100 SELECT queries generated somewhere else.
    // Each of them returns a million rows with 10 columns.
    List<string> queryList = GetQueries(@"\\someserver\bunch-o-queries.txt");
    DataTable workingTable;

    using (OdbcConnection con = new OdbcConnection("a connection string")) {
        using (OdbcDataAdapter adpt = new OdbcDataAdapter("", con)) {
            foreach (string sql in queryList) {
                workingTable = new DataTable();  // A new table is created. Previous one is abandoned
                adpt.SelectCommand.CommandText = sql;
                adpt.Fill(workingTable);
                CalcRankingInfo(workingTable);
                PushResultsToAnotherDatabase(workingTable);
                // Here I could call workingTable.Dispose() or workingTable.Rows.Clear()
                // or I could do nothing and hope the garbage collector cleans up my
                // enormous DataTable automatically.
            }
        }
    }

最佳答案

好的,该花点时间清理一下了(因为我的原始帖子有点泥泞)。

IDisposable与内存管理无关。 IDisposable允许对象清除它可能持有的任何 native 资源。如果对象实现IDisposable,则应确保使用using块或在完成后调用Dispose()

至于定义占用大量内存的对象,然后丢失对它们的引用,这就是垃圾收集器的工作方式。那是一件好事。让它发生,让垃圾收集器完成工作。

...因此,要回答您的问题,否。依靠.NET垃圾收集器并不是一个坏习惯。实际上恰恰相反。

关于.net - 依靠.NET自动垃圾收集器是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7520881/

10-10 18:39