9

次の方法を検討してください。

DoTimeIntensiveOperation()
{
    var t = new Stopwatch();

    foreach(var element in a_very_long_array)
    {
        DoATimeConsumingTask(element);
    }

    Console.WriteLine("Took me " + t.Elapsed);
    return;
}

t.Stop()戻る前に電話する必要がありますか?

私の知る限り、ガベージ コレクターは、メイン メソッドに戻る参照チェーンを持たないものはすべて破棄します。作成された への唯一の参照StopwatchtであるためDoTimeIntensiveOperationtが解放されると、Stopwatchは破棄できるようになります。しかし、それがまだ「カチカチ音をたてている」という事実は、GC に干渉しますか?

4

1 に答える 1

9

いいえ、この簡単なテストを行ったところ、GC が実行されるとストップウォッチが破棄されるようです。(コードは自由に修正してください)

 static void Main(string[] args)
 {
      DoTimeIntensiveOperation();

      GC.Collect();
      while (swRef.IsAlive)
      {
      }
      Console.WriteLine("Destroyed");
 }

 static WeakReference swRef = null;
 static void DoTimeIntensiveOperation()
 {
     Stopwatch sw = new Stopwatch();
     sw.Start();
     swRef = new WeakReference(sw);
     return;
 }

出力は呼び出されたDestroyedときGC.Collectです。もちろん、実際のプログラムでは明示的に呼び出すことはほとんどありませんGC.Collectが、これは、Stopwatch オブジェクトがStop呼び出されていない場合でも、メソッドのスコープ外になると破棄されることを示しています。

于 2013-04-21T18:00:45.453 に答える