2011-01-10 4 views
1

IDisposableを即座にインスタンス化せずにusingステートメントを書く方法はありますか?例えばステートメントを使用してC#で遅延インスタンス化

私はのような何かをする必要があれば、:

using (MyThing thing) 
{ 
    if (_config == null) 
    { 
     thing = new MyThing(); 
    } 
    else 
    { 
     thing = new MyThing(_config); 
    } 

    // do some stuff 

} // end of 'using' 

このようなケースのために受け入れられたパターンはありますか?または、私は再びIDisposableを明示的に処理することに戻りますか?

+0

1分以内に3つの(ほぼ)同一の応答が得られます。ニース! :D – Rob

答えて

4

あなたの例では、を実行します。は、ただちに条件に基づいて、すぐに使い捨てオブジェクトをインスタンス化します。たとえば、あなたが使用できます。

using (MyThing thing = _config == null ? new MyThing() : new MyThing(_config)) 
{ 
    ... 
} 

をより一般的であるためには、あなたがこの方法を使用することができます:インスタンス化のタイミングは様々な条件に基づいて変更された場合

using (MyThing thing = CreateThing(_config)) 
{ 
} 

をトリッキーなビットは次のようになります。 usingステートメントで処理するのは難しいでしょうが、であり、その要件を回避するためにコードをリファクタリングしてください。それはいつも可能ではありませんが、試してみる価値があります。

もう1つの方法は、「物」をラップにカプセル化して、の使い捨てオブジェクトを適切に作成し、処分のためにそのオブジェクトに委譲することです。このような代表者は状況によっては痛みを感じることがありますが、実際に何をしようとしているかによってはかもしれません。が適切です。

あなたが行うことができ
+0

徹底的で有益な、いつものように、ありがとう。 – fearofawhackplanet

2
using (MyThing thing = _config == null ? new MyThing() : new MyThing(_config)) 
{ 
    // .... 

} 
1

if (_config == null) 
{ 
    thing = new MyThing(); 
} 
else 
{ 
    thing = new MyThing(_config); 
} 

using (thing) 
{ 

    // do some stuff 
} 
1

私が最も健全なソリューションがMyThingコンストラクタに設定して何の決定を移動させることだと思います。そうすれば、クラスの使用を簡略化することができます。

using (MyThing thing = new MyThing(_config)) 
{ 

} 

class MyThing { 
    public MyThing() { 
    //default constructor 
    } 

    public MyThing(Config config) :this() { 
    if (config == null) 
    { 
     //do nothing, default constructor did all the work already 
    } 
    else 
    { 
     //do additional stuff with config 
    } 
    } 
} 
関連する問題