2009-04-15 12 views
6

クラスが常に安全に廃棄されるように、usingステートメントの使用を強制するある種の属性を使用して自分のクラスを修飾することが本当に好きでしょうかメモリリークを避けることができます。誰もそのような技術を知っていますか?C#でusingステートメントを使用することは可能ですか?

+0

何異なる使い捨てのオブジェクトに、オブジェクトを埋め込むことは? –

+0

IDisposableでクラスをデコレートすることは、クラスのコンシューマが、UsingでラップするかDisposeを呼び出すかのフラグになります。 「使用する」テクニックを適用すると、効果的にあなたの良心的な消費者に「あなたはあまりにも厚くてDisposeを呼び出すことができないと思う」と言って、使用を制限します。 –

+0

私はまた、誰かがあなたのオブジェクトをあるメソッドで作成し、それを別のメソッドに処分したいというシナリオがないと確信していますか? (おそらく彼らもIDisposableだ)。誰かがこれをすることは不可能になっています。 –

答えて

13

あなたが並べ替えることのできる方法が1つあります。デリゲートをとる静的メソッドを使用してオブジェクトにアクセスできるようにする方法があります。非常に簡単な例としては(当然のようにファイルを開いて多くの異なる方法がある - などの読み取り/書き込み):

public static void WorkWithFile(string filename, Action<FileStream> action) 
{ 
    using (FileStream stream = File.OpenRead(filename)) 
    { 
     action(stream); 
    } 
} 

あなたの使い捨てのオブジェクトのインスタンスを作成することができる唯一の事はあなた自身の内のメソッドである場合あなたが適切に使用されるようにすることができます。確かに、代議員が参照のコピーを取って後でそれを使用しようとするのを止めることは何もないが、それは全く同じ問題ではない。

この手法では、オブジェクトでできることが厳しく制限されますが、場合によっては有用かもしれません。

+2

私はこれに似た何かをやって少し汚いと感じました。*今はSkeetの支持を得ています* –

+0

これはどんな意味でも「新しい」パターンではありません。 –

5

FxCopを使用してこのルールを適用できます。ウィキペディアのquick overviewを参照してください。

+0

人がクラスを使用しているときには役に立ちません.FxCopを使用するようにユーザーに指示することはできません – ChrisF

+0

良い点。しかし、これは彼らの問題です:D –

+0

ビルドの一部にして、それに注意を払わなければなりません。 –

0

オブジェクトが常に廃棄されるようにするには、IDisposableと組み合わせてファイナライザを使用します。

あなたが行う前に、IDisposableとfinalizersを読んで、あなたのクラスが管理されていないリソースの寿命を管理するようなことをしない限り、通常は必要ないということを意識してください。

ファイナライザを使用すると、オブジェクトは「使用済み」で囲まれているかどうかにかかわらず「最終的に」回収されます。 IDisposableの便利なusingステートメントは、確定的なクリーンアップを実行できるようにします。唯一の注意点は、ファイナライザが付いたオブジェクトがクリーンアップするのがより高価で、一般的にはファイナライズを待っている間にメモリ内に長く張り付いていることです。

REF When do I need to implement a finalizer or IDisposable? またはtechnorabble: Using Dispose, Finalizers and IDisposable

関連する問題