4

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

IDisposableを継承する場合は必要ですが、継承する場合はどうすればわかりますか?

4

8 に答える 8

4

IDisposableを実装するものはすべて破棄する必要があります。使用してそれを包むだけです:

   using(var some = new Something())
   {
    //use normally
   }
于 2009-03-08T07:36:23.850 に答える
3

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

于 2009-03-09T03:03:05.980 に答える
2

クラスはインターフェースIDisposableを実装します。つまり、Disposeメソッドがあります。

IDisposableを実装するすべてのクラスで呼び出す必要があるわけではありませんDisposeが、ほとんどのクラスで呼び出す必要があります。クラスが実装しているIDisposable(またはDispose基本クラスからインターフェイスを継承しているためメソッドがある)場合は、次の2つの選択肢があります。

  1. ドキュメントを深く掘り下げて、クラスが実装する理由IDisposableと、本当にを呼び出す必要があるかどうかを確認してくださいDispose

  2. だけお電話Disposeください。

どちらの方法でも安全です。Disposeメソッドが何もしない場合、呼び出しは非常に高速になります。Dispose害を及ぼすことなく、複数回電話をかけることもできます。

メソッドを呼び出すだけでさらに良いのは、ブロックDisposeを使用することです。using

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

ブロックの最後の括弧で、Disposeメソッドが自動的に呼び出されます。usingブロックはとして実装されるtry...finallyため、ブロックDisposeで例外が発生した場合でもメソッドが呼び出されることが保証されます。

于 2009-03-08T07:41:39.847 に答える
0

クラスがIDisposableを実装している場合は、そのクラスのインスタンスを破棄する必要があります。そうでなければ、あなたはそうしません。この場合、HashAlgorithmはIDisposableから派生したICryptoTransformから派生します。これは、HashAlgorithmの子孫であるクラスのすべてのインスタンスを破棄する必要があることを意味します。

于 2009-03-08T07:37:05.300 に答える
0

IDisposableインターフェイスを実装するオブジェクトはすべて破棄する必要があります。

public abstract class HashAlgorithm : ICryptoTransform, 
IDisposable

管理されていないリソース(DB接続など)があるものはすべて、IDisposableインターフェイスを実装する必要があります。

これにはいくつかの理由があります。

  • 管理されていないリソース(通常は非常に少ない)がクリーンアップされることを知っています。通常、これらはファイナライザーでクリアされますが、GCがファイナライザーでオブジェクトを整理する必要があるため、これには時間がかかる場合があります。
  • 標準のdisposeパターンを実装すると、ファイナライザーを呼び出す必要がないため、GCの作業を大幅に節約できます。
于 2009-03-08T07:40:43.513 に答える
0

何かが IDisposable を継承するときに必要なことはわかっていますが、それを継承するときはどうすればわかりますか?

Visual Studio を使用していると仮定します。通常、タイプを右クリックしてから、「定義に移動」します。それまたはそのスーパー クラスのいずれかが IDisposable を実装していることがわかった場合は、必ず Dispose を呼び出します。これは通常、他の人が言及したように、using ブロックでラップすることによって行われます。

于 2009-03-08T09:33:50.433 に答える
0

「最後に部屋を出る人は電気を消してくれませんか?」

IDisposable を実装するオブジェクトは、「いつか」発生するはずの「クリーンアップ」操作を実行するために必要な情報と推進力を保持しますが、オブジェクトがまだ使用されている間は実行できません。オブジェクトが完全に放棄された場合、それらのクリーンアップ操作は行われません。システムにはカストディアンが含まれており、オブジェクトは作成時に登録できます。オブジェクトがカストディアン以外の全員によって放棄された場合、カストディアンは、オブジェクトを放棄する前に、オブジェクトにクリーンアップ アクションを実行するように依頼できます。さまざまな理由から、カストディアンは放棄されたオブジェクトを 100% 効果的に処理できるわけではないことに注意してください。したがって、可能な限り、オブジェクトへの有用な参照を保持する最後のエンティティが、参照を放棄する前にそれを破棄することが非常に望ましいです。

于 2011-02-15T16:51:23.390 に答える