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());
}
}
与其他代码块(if
、foreach
、...)类似,单行代码不需要大括号。
技术上,您仍然需要缩进。类似于:
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())
{
//...
}
我正在使用 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());
}
}
与其他代码块(if
、foreach
、...)类似,单行代码不需要大括号。
技术上,您仍然需要缩进。类似于:
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())
{
//...
}