3

クラスとという2つのクラスがMyFirstClassありMyAnotherClassMyAnotherClassIDiposableインターフェイスを実装しています。

public class MyFirstClass
{
   public string xyz{get;set;} ..... and so on
}


public class MyAnotherClass : IDisposable
{
   private readonly MyFirstClass objFc = new MyFirstClass();
   public static  void MyStaticMethod()
   {
        var objOfFirstClass = new MyFirstClass();
        // something with above object
   }

   public void MyNonStaticMethod()
   {
      // do something with objFc
   }

   #region Implementation of IDisposable
    .... my implementations
   #endregion
}

今、私が呼んMyAnotherClassでいるクラスがもう1つあります。これは、次のようなものです。

using(var anotherObj = new MyAnotherClass())
{
   // call both static and non static methods here, just for sake of example.
   // some pretty cool stuffs goes here... :)
}

では、オブジェクトのクリーンアップシナリオについて心配する必要がありますか?ObjFCまた、私の(非静的内部)と(内部静的)はどうなりますかobjOfFirstClass

AFAIK、使用するとすべてが処理されます...しかし、もっと知る必要があります...

4

4 に答える 4

8

objOfFirstClassメソッド内のローカル変数です。メソッドが終了すると、ガベージコレクションの対象になります。を実装していないため、そのままでは破棄されませんIDisposable

objFc親オブジェクトがスコープ外になると、ガベージコレクションの対象になります。繰り返しますが、これはそれを処分することとは何の関係もありません。

Dispose/は、単純なメモリ管理以外のIDisposableクリーンアップが必要な場合に使用します。CLRは、ガベージコレクションを使用してメモリのクリーンアップを処理します。これは、オブジェクトの実装で、終了時にメソッドが呼び出されるようにするための優れた方法です。ただし、必要なのがメモリ管理だけの場合は、それを使用する必要はありません。usingIDisposableDispose

于 2012-05-04T19:34:00.360 に答える
1

IDisposableオブジェクトが管理対象メモリ以外のリソースを使用していることを示します; たとえば、ファイルハンドル。このDisposeメソッドは、これらのリソースのクリーンアップを処理することになっています(そして、それが実装で実行する必要があります)。

CLRネイティブオブジェクト(例:この例のオブジェクト)は、それへの参照がなくなると(より具体的には、ガベージコレクターまたはGCと呼ばれるメカニズムによって)CLRによってガベージコレクションされます。IDisposableこのような場合は不要です。

利用するには、自分自身IDisposableを呼び出す必要がありDisposeます(またはusing、単なる構文糖衣であるを使用します)。GCによって自動的に呼び出されることはありません。

于 2012-05-04T19:36:34.140 に答える
0

メソッドを呼び出すIDisposable以外に魔法はありません。usingDispose

このクラスMyFirstClassは実装されていないためIDisposable、このクラスのインスタンスについて心配する必要はありません。これらのインスタンスには、破棄するものがないはずです。

破棄する必要のあるフィールドまたは変数がある場合は、を呼び出す必要がありますDisposeさらに、リファレンスが提案しているDisposeように、メソッドを呼び出すデストラクタを実装する必要があります。

~MyClass() {
    Dispose(false);
}

この場合、booleanパラメーターがフィールドを破棄してはならないことを指定している場合。詳細については、リンクされたmsdnページを参照してください。

于 2012-05-04T19:35:14.500 に答える
-1

IDisposeクラスを破棄しMyAnotherClassます。これは、MyFirstClassオブジェクトのローカル変数が何も指していないことを意味します。したがって、ガベージコレクターが実行されると、それらは再利用されます。

于 2012-05-04T19:34:55.400 に答える