質問
私はC#プログラムでusing
ブロックにいくつかのコードを追加しています。私は、以前のコードの既存の体内へのスタンドアロンだった私のアプリを詰めるの並べ替え、ので、私はそれが適切にフィットしてもらうためにいじりのビットを行う必要があります。
public class WrapperForMyOldApp
{
public static ItemThatINeed item1;
public static ItemThatINeed item2;
public WrapperForMyOldApp ()
{
item1 = new ItemThatINeed();
item2 = new ItemThatINeed();
}
public static go()
{
// some stuff that i need to do with items 1 and 2
}
}
public class MainProgram
{
.
.
.
public void MethodThatNeedsToMakeUseOfMyApp ()
{
....
using (WrapperForMyOldApp oldAPp = new WrapperForMyOldApp())
{
WrapperForMyOldApp.go();
}
}
}
私は今使用して、ブロックの効果を不具および/または悪影響クラスメインプログラムに影響を与える可能性のある特有の副作用を作成しました:さてさて、ここで問題がありそう?私は、ラッパーオブジェクトとそれの内容が配置され、実行は継続しますが予想通り何でも、私はそれを意識する必要があることを信じている私が見渡せるんだ?
ありがとう!
解決
これが機能するためには、あなたはWrapperForMyOldAppがIDisposableインターを実装持っている必要があります。
WrapperForMyOldAppで処分()の呼び出しは、あなたのクリーンアップを行うだろう。
しかし、静的オブジェクトは、典型的には、単一のオブジェクトを超えて存続期間を持つオブジェクトのために使用されます。一般的には、使用法のこのタイプのために、あなたが)その後、WrapperForMyOldApp.Dispose(でそれらをクリーンアップする、あなたのWrapperForMyOldAppコンストラクタでそれらを生成、非静的ItemThatINeedインスタンスを作ると思います。
あなたは、オブジェクトを作成し、次にあなたが(使用ブロックの最後に)クリーンアップを実行したいと言っているので、あなたは、廃棄()メソッドは、洗浄されるだろう - 静的オブジェクトで、あなたは潜在的に悪夢を作成しています静的オブジェクトアップ。彼らは再び慣れる場合は、何が起こるのでしょうか?あなたは2つのスレッドで2つのWrapperForMyOldAppインスタンスを作成する場合は、正しい行動とは何ですか?あなたは決定論的なクリーンアップをしたい場合、私は、これらの問題を検討する。
他のヒント
あなたのラッパークラスはIDisposableインターを実装していて、あなたはそれを示すいませんか?それは使い捨てではない場合は、すべてでusingステートメントを必要としません。
WrapperForMyOldApp
はIDisposable
を実装し、あなたのDispose()
の実装がすべてのリソースを取り除くことを確認することができます場合は、まあ、それが動作するはずです...しかし、他の副作用があることができます。コードは、そのような培養物として等これは、スレッドを生成可能性が、グローバル(静的)状態を変えることができます。あらゆる種類のもの。
これは悪いアプローチではありませんが、あなたはを内包しているコードはDispose()
は便利な何かをしようとしているかどうかを知るために、の何を知っている必要があります。