【发布时间】:2012-02-17 05:38:44
【问题描述】:
我正在查看一些代码并与同事讨论。
特别是一段看起来像这样的代码。
[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}
问题来了:
“为什么不将cn.Open移到GetConnection方法中。”
我说过如果“Open”抛出异常 dispose 将不会被调用。他的回答是
“那又怎样。连接没有打开,为什么需要获取 关闭(或处置)?”
对我来说,这只是不想知道我是否需要处置/关闭,所以我会在代码中重复 cn.Open,而不是将其移动到共享函数中。
但是这很有趣......所以我在SQL Server Connection Pooling (ADO.NET)做了一些阅读
对我来说,不清楚是否存在调用 cn.Open 并抛出异常以及需要调用 dispose 的情况。
所以在我下面的例子中,“TestNormalWay”和“WhyNotDoItThisWay”之间真的有什么区别
protected static DbConnection GetConnection()
{
DbConnection cn = new SqlConnection("SomeConnecitonstring... ");
return cn;
}
protected static DbConnection GetConnectionDangerousVersion()
{
DbConnection cn = new SqlConnection("SomeConnecitonstring... ");
cn.Open(); // this will throw.. .dispose not called
return cn;
}
[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}
[Test]
public void WhyNotDoItThisWay()
{
using(var cn = GetConnectionDangerousVersion())
{
// do stuff
}
}
【问题讨论】:
-
所以根据你所说的......以及我正在寻找的在WhyNotDoItTHisWay方法中调用Dispose的唯一方法..仅仅因为你调用Open不会自动释放连接这有意义吗.. 将 var cn 包裹在 using(){} 周围,cn 会自动处理,假设您也新建了该实例..
-
如果您使用的是 using 语句,则不必自己处置该对象。正如您的同事怀疑在尝试打开连接时是否发生异常,该对象不包含要实际处理的信息。此外,根据 Servy 的建议,如果您真的想要安全,您可以简单地使用 try()catch()finally() 块。