3

そのため、作成したクラスのデストラクタの実装を検討していましたが、実際にメモリを解放する方法や、これがガベージ コレクションによって処理されるかどうかはわかりません。

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);
}  

したがって、4 つのオブジェクトが作成されて実行され、これが 20 回行われます。
私の質問は、これらのオブジェクトを適切に破棄/破棄するにはどうすればよいですか? これらがガベージコレクションされているとは思いたくありませんが、デストラクタの実装は初めてです。

4

7 に答える 7

2

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

于 2012-04-27T19:28:32.787 に答える
1

これらのオブジェクトがいつガベージ コレクションされるかを制御することはできません。Henk Holtermanが述べたように、IDisposable の実装を検討するか、IDisposable パターンを使用する必要があるかもしれません。これを行う必要がない場合は、.Dispose()またはファイナライザーを使用しても心配ありません。~AutomatedTest()

これらのテスト メソッドにはしばらく時間がかかる可能性があると仮定するとtest1 = null;、このオブジェクト参照が使用されなくなったことを .NET に通知するために、使用が完了した後に言うことができます。

于 2012-04-27T19:28:50.993 に答える
1

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

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

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

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

クラスがIDisposableを実装したら、その作成を「using」ブロック内にラップすることで使用できます

 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
        }
    }
于 2012-04-27T19:57:28.927 に答える
0

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

于 2012-04-27T19:28:49.967 に答える
0

これに対する公正なルールは、「オブジェクトのいずれかが管理されていないリソースを処理する場合、または IDisposable を実装する場合は、それらを破棄する必要がある」と考えています。あなたが投稿したコードには管理されていないものは見当たりませんので、おそらく心配する必要はありません。ただし、明らかに見えないコードがあるため、確信が持てません。

適切な廃棄の説明については、このMSDN の記事をお読みください。

于 2012-04-27T19:29:20.683 に答える
0

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

したがって、解放する必要があるリソースがある場合は、実装するのが最善IDisposableです。

于 2012-04-27T19:29:20.933 に答える
0

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

于 2012-04-27T19:29:53.763 に答える