所以我要接管一个现有的项目,以前的编码员做了很多有趣的事情。
我看到最多但不是很明白的是下面的代码块
finally
{
if (conn != null)
{
conn.Close();
ds.Dispose();
}
}
return ds;
VS2010 没有抱怨,项目按预期工作,但这对我来说很奇怪。
如何处理然后返回?除非最终以某种方式返回后发生?
如果有人可以请解释为什么这是合法的?或任何其他解释将不胜感激。
所以我要接管一个现有的项目,以前的编码员做了很多有趣的事情。
我看到最多但不是很明白的是下面的代码块
finally
{
if (conn != null)
{
conn.Close();
ds.Dispose();
}
}
return ds;
VS2010 没有抱怨,项目按预期工作,但这对我来说很奇怪。
如何处理然后返回?除非最终以某种方式返回后发生?
如果有人可以请解释为什么这是合法的?或任何其他解释将不胜感激。
它是不正确的,因为您将丢失数据集中的信息,ds
所以在从它返回之前 进行处置。在 finally 块中处理连接似乎完全没问题,但不是必须返回到调用方法的数据集 ds。method
当您不再需要它们时,您应该 .Dispose() 对象。显然,在这个例子中你已经释放了 DataSet,所以你绝对不应该在这里释放它。
DataSet 上的 .Dispose() 实际上可能不会做任何事情,这就是代码似乎可以工作的原因。请记住,.Dispose() 旨在关闭并最终确定垃圾收集器无法执行的资源的使用,或者为了立即处理此类资源,而不是在垃圾收集器启动时。但您不应该依赖 .Dispose()在 DataSet 上不做任何事情 - 可能在某些情况下它确实做某事。修复代码。
就像 ds 似乎在它返回时被释放了,当你运行代码时它是否会给你任何错误,如果是的话,重构该代码,并//评论 ds.Dispose
当您调用 Dispose() 函数时,您只是将对象标记为垃圾收集,而不是立即“释放/销毁”该对象。这就是代码有效的原因。如果该逻辑没有任何意义,您可以随时执行以下操作:
try{
// ... your code
return ds;
}
catch(Exception x)
{
// ... Exception code
}
finally
{
if (conn != null)
{
conn.Close();
ds.Dispose();
}
}