我正在查看一些代码并与同事讨论。使用声明connection.open
特别是一段代码,看起来像这样。
[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}
的问题上来:
“为何不动的cn.Open到getConnection方法。”
我说如果“打开”引发异常处置不会被调用。他的回应是:
“那么,什么。连接没有打开,那么为什么它需要得到 关闭(或处置)?”
对我来说,这只是一个不想知道是否需要处置/关闭的问题,所以我会在代码中重复使用cn.Open,而不是将其移入共享函数。
但有趣的是...所以我做了一些阅读在SQL Server Connection Pooling (ADO.NET)
对我来说,如果存在其中调用cn.Open,它抛出一个场景,异常的处置将是不明确需要被调用。
在我下面的例子那么,真的有什么区别“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
}
}
所以根据你在说什么..我在看什么Dispose将在WhyNotDoItTHisWay方法中被调用的唯一方法..仅仅因为你调用Open不会自动处理连接这是否有意义。 。将var cn包装在using(){}中,cn会自动假设你已经新建了那个实例。 – MethodMan 2012-02-16 18:41:40
如果你使用** using **语句,你不应该处理你自己的对象。正如你的同事怀疑如果尝试打开连接时发生异常,该对象不包含实际处理的信息。此外,正如Servy所建议的,如果你真的想要安全,你可以简单地使用try()catch()finally()块。 – 2012-02-16 18:47:35