При использовании инициализаторов объектов, почему компилятор генерирует дополнительную локальную переменную?

Отвечая вчера на вопрос о SO, я заметил, что если объект инициализируется с помощью Object Initializer, компилятор создает дополнительную локальную переменную.

Рассмотрим следующий код C # 3.0, скомпилированный в режиме выпуска в VS2008:

public class Class1
{
    public string Foo { get; set; }
}

public class Class2
{
    public string Foo { get; set; }
}

public class TestHarness
{
    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.Foo = "fooBar";

        Class2 class2 =
            new Class2
            {
                Foo = "fooBar2"
            };

        Console.WriteLine(class1.Foo);
        Console.WriteLine(class2.Foo);
    }
}

Используя Reflector, мы можем проверить код для метода Main:

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 2
    .locals init (
        [0] class ClassLibrary1.Class1 class1,
        [1] class ClassLibrary1.Class2 class2,
        [2] class ClassLibrary1.Class2 <>g__initLocal0)
    L_0000: newobj instance void ClassLibrary1.Class1::.ctor()
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: ldstr "fooBar"
    L_000c: callvirt instance void ClassLibrary1.Class1::set_Foo(string)
    L_0011: newobj instance void ClassLibrary1.Class2::.ctor()
    L_0016: stloc.2 
    L_0017: ldloc.2 
    L_0018: ldstr "fooBar2"
    L_001d: callvirt instance void ClassLibrary1.Class2::set_Foo(string)
    L_0022: ldloc.2 
    L_0023: stloc.1 
    L_0024: ldloc.0 
    L_0025: callvirt instance string ClassLibrary1.Class1::get_Foo()
    L_002a: call void [mscorlib]System.Console::WriteLine(string)
    L_002f: ldloc.1 
    L_0030: callvirt instance string ClassLibrary1.Class2::get_Foo()
    L_0035: call void [mscorlib]System.Console::WriteLine(string)
    L_003a: ret 
}

Здесь мы видим, что компилятор сгенерировал две ссылки на экземплярClass2 (class2 а также<>g__initLocal0), но только одна ссылка на экземплярClass1 (class1).

Я не очень знаком с IL, но похоже, что он<>g__initLocal0перед настройкойclass2 = <>g__initLocal0.

Почему это происходит?

Следует ли из этого, что при использовании инициализаторов объектов происходит снижение производительности (даже если оно очень незначительное)?

Ответы на вопрос(3)

Ваш ответ на вопрос