私はいくつかのコードを見て、同僚と議論していました。using connection.open with statement
特にこのようなコードセクション。
[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}
質問が来た:
"なぜGetConnectionメソッドにcn.Openを移動しません。"
私は、 "オープン"が例外をスローするとディスパッチは呼び出されないと言った。彼の答えは
た「だから何な接続がそのように開かれていませんでした。なぜそれが が閉じて(または配置された)を取得する必要があるでしょうか?」
私にとっては、私がディスパージ/クローズする必要があるかどうかを知りたいのではなく、共有機能に移動するのではなく、コード内でcn.Openを繰り返すことです。
しかしそれは面白いですが...私はcn.Openを呼び出すと、それがスローするシナリオと例外処分は希望がある場合は私にSQL Server Connection Pooling (ADO.NET)
でいくつかの読書は、それが明確ではありませんでした呼び出される必要があります。以下の私の例ではそう
あなたは常には、すぐにそれはだとして、接続を開きたい、本当に「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を呼び出したからといって、自動的に接続を破棄しないからです。 .vnをusing(){}にラップすると、cnは自動的に破棄され、そのインスタンスも同様に新しいものとみなされます。 – MethodMan
** using **ステートメントを使用している場合は、あなた自身のオブジェクト。接続を開こうとしたときに例外が発生した場合、あなたの同僚が疑うように、オブジェクトには実際に処分する情報が含まれていません。さらに、Servyが提案しているように、本当に安全であることが必要な場合は、try()catch()finally()ブロックを単純に使用できます。 –