【问题标题】:When is it advisable to control the garbage collection under C#什么时候最好控制 C# 下的垃圾回收
【发布时间】:2018-04-09 12:47:00
【问题描述】:

我正在使用 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());
        }
    }
}

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

【问题讨论】:

  • 一般来说,如果您正在与不属于您的应用程序的进程/服务/程序/任何东西进行交互,那么 using 语句是一个好主意。
  • usingIDisposable 不是 garbage collection 有关。
  • 这里的垃圾回收不是你控制的。尽可能使用using-语句(IDisposable)。但这与负责收集垃圾(不再使用的对象占用的内存)的垃圾收集器无关。处置是关于非托管对象和关于托管对象的垃圾回收。
  • 无论何时创建IDisposable 对象,最好尽快调用Disposeusing 是一个很好的方法,如果这要在同一个方法中发生的话。

标签: c# idisposable


【解决方案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())
{
    //...
}

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多