1

所以我要接管一个现有的项目,以前的编码员做了很多有趣的事情。

我看到最多但不是很明白的是下面的代码块

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

VS2010 没有抱怨,项目按预期工作,但这对我来说很奇怪。

如何处理然后返回?除非最终以某种方式返回后发生?

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

4

4 回答 4

3

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

于 2012-07-03T10:18:39.047 回答
1

当您不再需要它们时,您应该 .Dispose() 对象。显然,在这个例子中你已经释放了 DataSet,所以你绝对不应该在这里释放它。

DataSet 上的 .Dispose() 实际上可能不会做任何事情,这就是代码似乎可以工作的原因。请记住,.Dispose() 旨在关闭并最终确定垃圾收集器无法执行的资源的使用,或者为了立即处理此类资源,而不是在垃圾收集器启动时。但您不应该依赖 .Dispose()在 DataSet 上不做任何事情 - 可能在某些情况下它确实做某事。修复代码。

于 2012-07-03T10:23:26.107 回答
0

就像 ds 似乎在它返回时被释放了,当你运行代码时它是否会给你任何错误,如果是的话,重构该代码,并//评论 ds.Dispose

于 2012-07-03T10:19:10.650 回答
0

当您调用 Dispose() 函数时,您只是将对象标记为垃圾收集,而不是立即“释放/销毁”该对象。这就是代码有效的原因。如果该逻辑没有任何意义,您可以随时执行以下操作:

try{
    // ... your code
    return ds;
}
catch(Exception x)
{
    // ...  Exception code
}
finally
{
   if (conn != null)
   {
       conn.Close();
       ds.Dispose();
   }
}
于 2013-08-28T18:03:28.677 回答