Есть ли улучшение производительности при использовании инициализатора объекта, или это эстетично?

Итак, сравнение было бы между:

MyClass foo = new MyClass();
foo.Property1 = 4;
foo.Property2 = "garfield";

и

MyClass foo = new MyClass { Property1 = 4, Property2 = "garfield" };

Является ли это синтаксическим сахаром или на самом деле какой-то прирост производительности (как бы это ни было возможно?)

Ответ 1

На самом деле, возможно, очень немного медленнее использовать инициализатор объекта, чем вызвать конструктор, а затем назначить свойства, так как он имеет одно дополнительное назначение:

MyClass foo = new MyClass();
foo.Property1 = 4;
foo.Property2 = "garfield";

против

MyClass tmp = new MyClass();
tmp.Property1 = 4;
tmp.Property2 = "garfield";
MyClass foo = tmp;

Все свойства назначаются до того, как ссылка будет назначена переменной. Это различие является видимым, если оно повторно использует переменную:

using System;

public class Test
{
    static Test shared;

    string First { get; set; }

    string Second
    {
        set
        {
            Console.WriteLine("Setting second. shared.First={0}",
                              shared == null ? "n/a" : shared.First);
        }
    }

    static void Main()
    {
        shared = new Test { First = "First 1", Second = "Second 1" };
        shared = new Test { First = "First 2", Second = "Second 2" };        
    }
}

Результат показывает, что во второй строке Main, когда Second устанавливается (после First), значение shared.First по-прежнему остается "первым 1" - т.е. shared не имеет было присвоено новое значение.

Как говорит Марк, вы почти наверняка никогда не заметите разницу.

Анонимные типы гарантируют использование конструктора - форма указана в разделе 7.5.10.6 спецификации языка С# 3.

Ответ 2

Для стандартных типов полностью сахар. Для анонимных типов вы можете обнаружить, что он использует конструктор за кулисами, но поскольку синтаксис инициализатора является только способом их назначения, это спорная точка.

Это включает в себя несколько вызовов, чем, скажем, конкретный конструктор, но я был бы изумлен, если бы вы когда-либо видели разницу в результате. Просто используйте синтаксис инициализатора - он более дружелюбен: -o

Ответ 3

Нет улучшения производительности. Под капотом компилятор генерирует присваивания тем же свойствам и полям. Он будет выглядеть так же, как и ваша расширенная версия.

Ответ 4

Я использую синтаксический сахар, и компилятор генерирует тот же самый точный IL, что и раньше, до того, как инициализаторы объектов были введены в .NET 3.5