是否可以将数据集置于finally块中然后返回数据集?

时间:2012-07-03 10:15:41

标签: c# dataset dispose try-catch-finally

所以我接手一个现有的项目,前一个程序员做了很多有趣的事情。

我看到的最多但并不是真正理解的是以下代码块

finally
{
   if (conn != null)
   {
       conn.Close();
       ds.Dispose();
   }
}
return ds;

VS2010没有抱怨,该项目按计划运作,但这对我来说很不错。

如何处理然后归还?除非最终以某种方式返回?!

如果有人可以解释为什么这是合法的?或任何其他解释将不胜感激。

4 个答案:

答案 0 :(得分:3)

在从ds撤回method之前处置{{1}}是不正确的,因为您将丢失数据集中的信息。 在finally块中处理连接似乎完全没问题,但是数据集 ds必须返回到调用方法。

答案 1 :(得分:1)

当你不再需要它们时,你应该.Dispose()对象。显然,在这个例子中处理完DataSet后你需要它,所以你绝对不应该把它放在这里。

。对DataSet的Dispose()实际上可能没有做任何事情,这就是代码看起来有用的原因。请记住.Dispose()意味着关闭并最终确定垃圾收集器无法完成的资源使用,或者为了立即处理这些资源而不是垃圾收集器启动时。 但是你不应该依赖于DataSet上的.Dispose()而不做任何事情 - 可能存在它确实做某事的情况。修复代码。

答案 2 :(得分:0)

就像它看起来ds在返回时被处理掉,在运行代码时它是否会给你任何错误,如果是这样重构代码,并且//注释ds.Dispose

答案 3 :(得分:0)

当您调用Dispose()函数时,您只是标记要被垃圾收集的对象,您不会立即“释放/销毁”该对象。这就是代码工作的原因。如果这个逻辑没有任何意义,你总是可以这样做:

try{
    // ... your code
    return ds;
}
catch(Exception x)
{
    // ...  Exception code
}
finally
{
   if (conn != null)
   {
       conn.Close();
       ds.Dispose();
   }
}