C#下什么时候控制垃圾回收比较合适

When is it advisable to control the garbage collection under C#

我正在使用 C# 开发 Windows 服务,它主要扫描特定目录以查找新创建的文件。如果已创建文件,则文件名字符串被拆分,文件名的特定子字符串用于查询 SQL 数据库。由于此服务是 运行 永久的,我希望它尽可能对内存友好,因此我被告知在使用 SqlDataAdapter 和 DataTable 对象时使用自动垃圾收集。考虑以下代码:

using (SqlDataAdapter da = new SqlDataAdapter(cmdstring, con))
{
    using (DataTable dt = new DataTable())
    {
        da.Fill(dt);

        if (dt.Rows.Count != 0)
        {
            splitlst.Add(dt.Rows[0][0].ToString());//kunde
            splitlst.Add(dt.Rows[0][1].ToString());
            splitlst.Add(dt.Rows[0][2].ToString());
            splitlst.Add(dt.Rows[0][3].ToString());
            splitlst.Add(dt.Rows[0][4].ToString());
            splitlst.Add(dt.Rows[0][5].ToString());
        }
    }
}

这是处理垃圾收集的有效方法吗?我真的不习惯这样工作,所以如果有人能让我明白什么时候故意控制垃圾收集,我会非常感激。

代码不错;但出于错误的原因(有点)。


I've been told to use the automatic garbage collection

有点滑稽,您不需要显式使用自动垃圾收集。因为它是自动的。


using块用于处理对象(实现IDisposable接口)。

这里的意图(降低内存使用率)是一样的。许多一次性对象会释放它们的数据;以便允许自动垃圾收集器在需要时清理它。


作为一个非常小的注释,您可以通过省略顶部 using 语句的括号来减少嵌套:

using (SqlDataAdapter da = new SqlDataAdapter(cmdstring, con))
using (DataTable dt = new DataTable())
{
    da.Fill(dt);

    if (dt.Rows.Count != 0)
    {
        splitlst.Add(dt.Rows[0][0].ToString());//kunde
        splitlst.Add(dt.Rows[0][1].ToString());
        splitlst.Add(dt.Rows[0][2].ToString());
        splitlst.Add(dt.Rows[0][3].ToString());
        splitlst.Add(dt.Rows[0][4].ToString());
        splitlst.Add(dt.Rows[0][5].ToString());
    }
}

与其他代码块(ifforeach、...)类似,单行代码不需要大括号。

技术上,您仍然需要缩进。类似于:

if(1 + 1 != 2) 
    BurnMathBooks(); //still indented

从技术上讲,您也应该这样做:

using (SqlDataAdapter da = new SqlDataAdapter(cmdstring, con))
    using (DataTable dt = new DataTable())  //still indented
    {
        //...
    }

但是由于缺少缩进实际上并没有使代码更难读;在这种情况下省略它是可以接受的。

using (SqlDataAdapter da = new SqlDataAdapter(cmdstring, con))
using (DataTable dt = new DataTable())
{
    //...
}