2012-04-27 10 views
3

私は書いたクラスのデストラクタを実装していますが、実際にメモリを解放する方法やガベージコレクションによって処理されるかどうかはわかりません。クラスを使用する方法デストラクタの適切な使用C#

class AutomatedTest 
{ 
    public bool testComplete = false; 
    public bool testStopRequest = false; 

    public List<Command> commandList = new List<Command>(); 

    private bool loggingEnabled = false; 
    ... 


    public AutomatedTest(TestList testToCreate) 
    { 
     // Create a list of Command objects and add them to the list 
    } 
} 

for(int numTests = 0; numTests < 20; numTests++) 
{ 
    AutomatedTest test1 = new AutomatedTest(TestList._1DayTest); 
    RunAutoTest(test1); 

    AutomatedTest test2 = new AutomatedTest(TestList._2DayTest); 
    RunAutoTest(test2); 

    AutomatedTest test3 = new AutomatedTest(TestList._3DayTest); 
    RunAutoTest(test3); 

    AutomatedTest test4 = new AutomatedTest(TestList._4DayTest); 
    RunAutoTest(test4); 
} 

SO 4つのオブジェクトが作成され、実行され、これが20回行われています。
私の質問は、これらのオブジェクトを適切に処分/破壊する方法です。私はこれらがガベージコレクションであると仮定したくないですが、デクタクタを実装するのは初めてです。

+0

[IDisposableをVSデストラクタ?](http://stackoverflow.com/questions/456213/destructor-vs-idisposable)の可能性のある複製を作成するよりも好ましいです – BrokenGlass

答えて

1

IDisposableを実装するオブジェクトを使用しない限り、手動で破棄または削除する必要はありません。

0

あなたの最善の策は詳細なIDパターンですhereです。しかし、他の人が指摘しているように、あなたのオブジェクトがファイルハンドル、ストリーム、DBオブジェクトなどの高価なリソースを保持している場合にのみ必要です。その他はすべてGCによって収集されます。それを信じる。

1

これらのオブジェクトがガベージコレクトされるタイミングを制御することはできません。上記のHenk Holtermanに記載されているように、IDisposableの実装を検討するか、IDisposableパターンを使用する必要があります。これを実行する必要がない場合、私はこれらの試験方法は、しばらく時間がかかるかもしれないと仮定すると、.Dispose()またはファイナライザ、~AutomatedTest()

を使用して心配しないでしょう、あなたは.NETが知っているように、それを使用して行われた後、あなたはtest1 = null;を言うことができますこのオブジェクト参照はもはや使用されていません。そうでない場合は、スコープGCから外れた後、GCは物事を整理します。

0

これは、 "管理対象リソースを処理したり、IDisposableを実装しているオブジェクトがあれば、そのオブジェクトを破棄する必要があります。あなたが投稿したコードには管理されていないものはありませんので、おそらく心配する必要はありません。しかし、私たちが見ることのできないコードがはっきりしているので、わかりません。

適切な処分の説明については、MSDN Articleをお読みください。

0

一般に呼び出される「デストラクタ」またはFinalizerは、オブジェクトがガベージコレクションされるまで呼び出されません。

リソースを解放する必要がある場合は、IDisposableを実装することをお勧めします。

0

高価なオブジェクトの処分を処理する方法の1つは、IDisposableインターフェイスを実装し、DisposeおよびFinalizeメソッドを実装することです。これは、クラスがアンマネージコードに依存し、それらをクリーンアップする責任がある場合に推奨されるパターンです。詳細here

0

オブジェクトのガベージコレクションが行われると、クラスのデストラクタが呼び出されます。 C#のようなマネージプログラミング言語では、ガベージコレクタが実行され、デストラクタを実行するタイミングを制御することはできません。ガベージコレクションは、オブジェクトがもはや参照されていないか、プログラムの後半で使用されていることがわかると、CLR(共通言語ランタイム)によって処理されます。あなたの例では、RunAutoTest(TEST1)を実行した後、コード

AutomatedTest test1 = new AutomatedTest(TestList._1DayTest); 
RunAutoTest(test1); 

を考慮すると、「test1の」参照変数は使用されなくなりましたし、ガベージコレクションのために利用できるようになります。ただし、実際のガベージコレクションプロセスはすぐに実行されない可能性があり、特定の時間に実行する方法はありません。 AutomatedTestクラス内でFileStreamなどを開くなどのリソースを使用している場合は、そのクラスのオブジェクトを使用してこれらのリソースを解放する必要があります。これは、あなたのクラスは、次のようにIDisposableインターフェイスを実装することによって行うことができます

class AutomatedTest:IDisposable 
    { 
     public void Dispose() 
     { 
      //free up any resources 
     } 
    } 

あなたのクラスはIDisposableインターを実装したら、あなたは「を使用して」ブロック

for (int numTests = 0; numTests < 20; numTests++) 
     { 
      using (AutomatedTest test1 = new AutomatedTest(TestList._1DayTest)) 
      { 
       RunAutoTest(test1); 
      } 
      //as soon as code exits the 'using' block the dispose method on test1 would be called 
      //this is something you cannot guarantee when implementing a destructor 

      using (AutomatedTest test2 = new AutomatedTest(TestList._2DayTest)) 
      { 
       RunAutoTest(test2); 
      } 
      //dispose on test2 will be called here 

      ///rest of code 
     } 

以内に、それは創造だラップすることにより、それを使用することができます参考までに〜を使ってC#でデストラクタを実装することは可能です。 IDisposableインターを実装する方法は、デストラクタ

class AutomatedTest 
    { 

     ~AutomatedTest() 
     { 
      //code will run only on garbage collection 
     } 
    }