2009-03-08 11 views
4

私は何かを処分する必要があるのですか?誰かが私のコードにいくつかのオブジェクトを持っていたと言います。私は何かを処分する必要があるとは考えていませんでした(これはC#の最初の週です)。オブジェクトを処分する必要があるときは、どうすればわかりますか?私はhttp://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspxを使用していました。私はページ上にdisposeの言及を見ないか、他のobjsで言及したことを見ました。オブジェクトを処分する必要があるときは、どうすればわかりますか?

私は何かがIDisposableを継承する必要があることを知っていますが、それを継承するときに知っていますか?

答えて

4

IDisposableを実装するものはすべて処分する必要があります。

using(var some = new Something()) 
    { 
    //use normally 
    } 
0

クラスがIDisposableを実装する場合は、そのクラスのインテンシティを処分する必要があります。それはあなたがしない場合。この場合、HashAlgorithmはIDisposableから派生したICryptoTransformから派生します。つまり、HashAlgorithmから降順のクラスのインスタンスをすべて削除する必要があります。

0

IDisposableインターフェイスを実装するオブジェクトはすべて削除してください。

public abstract class HashAlgorithm : ICryptoTransform, 
IDisposable 

管理対象外のリソース(DB接続など)を持つものであれば、IDisposableインターフェイスを実装する必要があります。

このため十分な理由がいくつかあります:

  • あなたは(一般的には非常に不足している)アンマネージリソースをクリーンアップしようとしていることを知っています。とにかくこれらはファイナライザでクリアされますが、GCがファイナライザを使ってオブジェクトを整理しなければならないので、しばらく時間がかかります。
  • あなたがdispose pattern標準を実装する場合は、ファイナライザを呼び出す必要はありませんとあなたがGCに多くの作業を保存します。ここ
2

クラスはIDisposableというインターフェイスを実装しています。つまり、メソッドはDisposeです。

IDisposableインターを実装するすべてのクラスはDisposeを呼び出すためにあなたを必要としますが、それらのほとんどはしないでください。あなたはクラスがIDisposableを実装(またはそれが基本クラスからインターフェイスを継承するためDispose方法を持っている)ことを確認した場合、次の2つの選択を書くことがあります。なぜクラスが実装を見つけることがマニュアルの深い

  1. 掘るをIDisposableあなたが本当にDisposeに電話する必要がある場合。

  2. ちょうどDisposeを呼び出します。

どちらの方法も安全です。 Disposeメソッドが何もしない場合、呼び出しは非常に速くなります。 Disposeに何度も電話しても問題ありません。 Disposeメソッドが自動的に呼び出されるブロックのエンドブラケットで

using (FileStream s = File.OpenRead(path)) { 
    ... 
} 

だけDisposeメソッドを呼び出すと、その後さらに良いことにはusingブロックを使用することです。 usingブロックはtry...finallyとして実装されているため、ブロック内で例外が発生してもDisposeメソッドが呼び出されることが保証されています。

0

私は私がIDisposableインターは何かを継承し するときに必要な知っているが、それはそれを継承しない場合はどうすれば を知っていますか?

あなたはVisual Studioを使用していると仮定します。私は通常、タイプを右クリックし、次に "定義に移動"します。 IDisposableを実装していれば、Disposeを呼び出していることを確認します。これは通常、他のものが言及したように、それをusingブロックにラップすることによって行われます。

3

簡単な方法は、obj.dispと入力してintellisenseにdisposeメソッドがあるかどうかを確認することです。

+0

この問題は、 'obj'が' IDisposable' [明示的](http://msdn.microsoft.com/en-us/library/ms173157.aspx)を実装するタイプの場合、intellisenseは上記の手法では方法を見つけることはできません。 'IDisposable d = obj;'と入力してエラーが出るかどうかを確認する必要があります。 –

+0

@JeppeStigNielsen新しく受け入れられた答えは? –

+0

正しいです。 'using(obj){}'がエラーなしでビルドされている場合、コンパイル時の型objは 'IDisposable'を実装します。そして、その場合には 'using 'を使うべきです。たいていの場合、ローカル変数の代入は 'using(var obj = someMethodCallOrNewObjectExpression()){...} 'のように、'() 'の角括弧内に置く方が良いでしょう。 –

0

"最後の人は部屋から出て、照明を消してもらえますか?"

IDisposableを実装するオブジェクトは、「いつか」に発生する必要があるが、オブジェクトがまだ使用されている間には起こり得ない何らかの「クリーンアップ」操作を行うために必要な情報と刺激を保持します。オブジェクトが完全に放棄された場合、それらのクリーンアップ操作は行われません。このシステムには、オブジェクトが作成されたときに登録できる管理人が含まれています。カストディアン以外のすべての人が対象を放棄した場合、カストディアンは、カストディアンがそれを放棄する前に、そのクリーンアップアクションを実行するようにオブジェクトに依頼することができます。様々な理由から、保管人は放棄された物を取り扱う際に100%有効ではないことに注意してください。従って、可能な限り、参照を放棄する前にオブジェクトの有用な参照を保持する最後のエンティティがそれを処分することが非常に望ましい。

関連する問題