title: Resurrection difference in using Object Initializer
body: <p>I have this code:</p>
  
  <p>Essentially i'm trying to demonstrate the use of the c# finalizer and make an object that cannot die, I called it Zombie. Now, normally this demo works great, but today I tried using the same code with the object initializer instead of just assigning to the property (Name in this case). I noticed there is a difference. Namely that the finalizer never gets called, not even when I'm trying my best to make the Garbage Collector do it's work. </p>
  
  <p>Could someone explain the difference, or have I found a bug in the C# compiler?</p>
  
  <p>(I'm using C# 4 in VS2010 SP1 on Win7x64)</p>
  
  <p>Thanks.</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading;
  
  namespace Zombie
  {
    class Program
    {
      static void Main(string[] args)
      {
        Console.WriteLine("Main thread: " + Thread.CurrentThread.ManagedThreadId);
  
                // case 1: this is where the problem is located.
        Zombie z = new Zombie { Name = "Guy" }; // object initializer syntax makes that the finalizer is not called.
  
                // case 2: this is not causing a problem. The finalizer gets called.
        //Zombie z = new Zombie();
        //z.Name = "Guy";
  
        WeakReference weakZombieGuyRef = new WeakReference(z, true);
  
        z = null;
  
        GC.GetTotalMemory(forceFullCollection: true);
  
        GC.Collect();
  
        while (true)
        {
  
          Console.ReadKey();
          if (weakZombieGuyRef.IsAlive)
          {
            Console.WriteLine("zombie guy still alive");
          }
          else
          {
            Console.WriteLine("Zombie guy died.. silver bullet anyone?");
          }
  
          Zombie.Instance = null;
  
          GC.AddMemoryPressure(12400000);
          GC.GetTotalMemory(forceFullCollection: true);
  
          GC.Collect();
        }
  
  
      }
    }
  
    public class Zombie
    {
      public string Name { get; set; }
      public  static Zombie Instance = null;
  
      ~Zombie()
      {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        Console.WriteLine("Finalizer called on zombie" + this.Name);
        lock (typeof(Zombie))
        {
          Instance = this;
  
          GC.ReRegisterForFinalize(this);
        }
      }
    }
  }
  </code></pre>