我正在开发一个应用程序,在这个应用程序中,我用来编写整个代码的每个方法或事件都在try ... catch ... finally block.Here是我以前编写的代码的结构。
//Some Declarations
DataTable dt = new DataTable()
try
{
//Some code
}
Catch
{
}
Finally
{
dt = null;
}
这就是我以前编写代码的方式。我的问题是我只在try子句中使用datatable。所以有必要在finally子句中配置dt。因为我教这么做。但据我所知,如果我在try子句中声明dt,一旦try的范围结束,它将自动处理并设置为null。那么哪一个更好的方法呢?
提前致谢...
答案 0 :(得分:3)
dt = null;
不会处置该对象。它只是删除了引用。如果dt
位于方法中且其范围以方法结束的位置结束,则无需为其指定null
。
将null
分配给变量后,该对象就有资格进行垃圾回收!我的意思是说...... GC会检查堆中的每个对象是否在某处被引用,如果没有,则将其标记为垃圾。检查完所有对象后,开始收集过程。通过将null
分配给dt
,您通知GC该对象是垃圾。因此,在下一个集合中,它将被收集。
答案 1 :(得分:1)
如果在try中或try块之前声明了数据表,则不会“处理”。处置对象通常与IDisposable接口和using语句有关。确实需要处理某些对象,因为它们在后台使用资源(如Sql连接)。我没有看到为什么需要对数据表进行此操作。
此外,我认为在你的finally块中将dt设置为null没有意义,它不会加速垃圾收集或关闭任何其他资源。
请参阅此其他堆栈溢出问题.... Should I Dispose() DataSet and DataTable?
答案 2 :(得分:0)
绝对是处理IDisposable的所有对象(如果可能)的最佳做法。如果您不关心异常,可以使用using语句。类似的东西:
using(DataTable dt = new DataTable())
{
// code here
}
// datatable is disposed
答案 3 :(得分:0)
如果您愿意,可以使用Using语句。
声明:
using (ResourceType resource = expression) statement
相当于
{
ResourceType resource = expression;
try {
statement;
}
finally {
((IDisposable)resource).Dispose();
}
}
所以我猜你可以编码:
using(DataTable dt = new DataTable)