我在看一些代码,并与同事们讨论。
具体地说,是这样的一段代码。
[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}
有人问:
"为什么不把cn.Open放到GetConnection方法中呢?"
我的回答是,如果"Open"抛出异常,Dispose将不会被调用。他的回应是
"那怎样?连接没有打开,为什么需要关闭(或Dispose)呢?"
对我来说,这只是不想知道是否需要Dispose/Close的问题。因此,我会在代码中重复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
}
}