C# 4.0 如果封闭方法即将返回,是否需要停止秒表?

C# 4.0 如果封闭方法即将返回,是否需要停止秒表?,c#-4.0,garbage-collection,stopwatch,C# 4.0,Garbage Collection,Stopwatch,考虑以下方法: DoTimeIntensiveOperation() { var t = new Stopwatch(); foreach(var element in a_very_long_array) { DoATimeConsumingTask(element); } Console.WriteLine("Took me " + t.Elapsed); return; } 返回前是否需要调用t.Stop() 据我所知,

考虑以下方法:

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

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

    Console.WriteLine("Took me " + t.Elapsed);
    return;
}
返回前是否需要调用
t.Stop()


据我所知,垃圾收集器将销毁任何没有返回到主方法的引用链的东西。创建的
秒表的唯一参考是
t
,因此当
DoTimeIntensiveOperation
时,
t
将被释放,
秒表应符合销毁条件。但是,它仍然“滴答”的事实是否会干扰GC?

不,我抛出了这个快速测试,似乎一旦GC运行,秒表就会被破坏。(请随意更正代码)

调用
GC.Collect
时,输出被销毁。当然,在实际的程序中,您不太可能显式调用
GC.Collect
,但这是为了表明,即使未调用
Stop
,Stopwatch对象也会在超出方法范围后被销毁

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