2

FooDataContext私は、 LinqのDataContextを実装するクラスを持っていDispose()ます..

public partial class FooDataContext : System.Data.Linq.DataContext {...}

fooDataContext 内で宣言する必要があることはわかっているusing(<here>){}ので、このように Dispose() が呼び出されます

public void Bar()
{
    using (var fooDataContext = new FooDataContext(ConnStr))
    { // some code
    }
}

しかし、これがちょうど良いかどうかはわかりません。それは...ですか?舞台裏で何が起こっているのですか?

public void Baz()
{
    var fooDataContext = new FooDataContext(ConnStr);
    using (fooDataContext)
    { // some code
    }
}
4

2 に答える 2

4

後者は基本的に同じように動作しますが、欠点が 1 つあります。ステートメントが破棄されるにもかかわらず、ステートメントのfooDataContext 外部を参照できます。usingそれはめったに良い考えではありません。

はい、2 番目のスニペットを使用することは完全に合法ですが、ほとんどの場合、最初のバージョンを優先する必要があります。

于 2012-07-17T09:12:37.363 に答える
2

using特にカスタム コードを追加する場合、インスタンス化と の間で例外が発生する可能性があります。using 内でコンストラクターを呼び出す方が安全です。さらに、最初のソリューションでは、破棄されたコンテキストでの作業を防ぎます。

public void Baz() 
{ 
    var fooDataContext = new FooDataContext(ConnStr); 
    //Exception here -> fooDataContext not disposed
    using (fooDataContext) 
    { // some code 
    }
    //You can see fooDataContext here
} 

fooDataContextの後に変数を本当に見たい場合はusing、これを試すことができます:

public void Baz() 
{ 
    var fooDataContext; 
    using (fooDataContext = new FooDataContext(ConnStr))
    { // some code 
    } 
    //You can see fooDataContext here
} 
于 2012-07-17T09:20:52.833 に答える