编译器是否将已处置的对象设置为null?

Bas*_*ili 2 .net c# garbage-collection

我有以下代码:

public class Program
{
 private static Task task;
 private static int counter = 0;

 private static void Main(string[] args)
 {
   for (int i = 0; i < 10; i++)
   {
    if (task == null)
    {
      Console.WriteLine(++counter);
    }

     using (task = new Task(Method))
     {
       task.Start();
       task.Wait();
     }

     //  task = null;

     GC.Collect();
     GC.WaitForPendingFinalizers();
   } 

   Console.ReadKey();
 }

 public static void Method() { }
 }
Run Code Online (Sandbox Code Playgroud)

我的例外输出:1 2 3 4 5 6 ...但此方法的实际输出为1!

如果我从代码行中删除注释,Task = null;那么我将成为预期的结果.

为什么处理的任务不为空!?我想,如果对象被处理掉,那么它们可以从GC设置为null(我已经强制GC收集),换句话说GC会收集处理过的(孤儿)对象并将它们置为空?!

Mar*_*ell 6

你为什么期望它被设置为null?using/ Dispose()从不说它会那样做.它承诺处置它.这里的最佳做法是在using语句中使用单独的变量以避免混淆:

using(var t = new Task(Method))
{
    t.Start();
    t.Wait();
}
Run Code Online (Sandbox Code Playgroud)

但是如果你想要它设置为null; 将其设置为null:

task = null;
Run Code Online (Sandbox Code Playgroud)

至于你的另一点:

换句话说,GC将收集处置的(孤儿)对象并将它们置为空?!

GC从不设置任何东西null; 它收集无法到达的东西:就是这样