什么时候建议在C#下控制垃圾收集

时间:2018-04-09 12:47:01

标签: c# idisposable

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

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());
        }
    }
}

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

1 个答案:

答案 0 :(得分:1)

代码很好;但出于错误的原因(某种程度)。

  

我被告知要使用自动垃圾收集

有点讽刺,您不需要显式使用自动垃圾回收。因为它是自动的。

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())
{
    //...
}