Различные виды инициализации объекта - PullRequest
5 голосов
/ 02 марта 2011

Привет Мне было интересно, есть ли какая-либо разница между инициализацией объекта, подобным этому

MyClass calass = new MyClass()
{
  firstProperty = "text",
  secondProperty = "text"
}

и инициализирующий объект, подобный этому

MyClass calass = new MyClass   // no brackets
{
  firstProperty = "text",
  secondProperty = "text"
}

Мне также было интересно, как называется инициализация такого рода

Ответы [ 2 ]

9 голосов
/ 02 марта 2011

Нет, абсолютно без разницы.В обоих случаях вы используете выражение инициализатора объекта .Инициализаторы объектов были введены в C # 3.

В обоих случаях это точно эквивалентно:

// tmp is a hidden variable, effectively. You don't get to see it.
MyClass tmp = new MyClass(); 
tmp.firstProperty = "text";
tmp.secondProperty = "text";

// This is your "real" variable
MyClass calass = tmp;

Обратите внимание, как присвоение calass происходит только после свойства были назначены - так же, как вы ожидаете от исходного кода.(В некоторых случаях я считаю, что компилятор C # может эффективно удалить дополнительную переменную и переставить назначения, но он должен заметно вести себя как этот перевод. Это, безусловно, может иметь значение, если вы переназначаете существующую переменную.)

РЕДАКТИРОВАТЬ: Небольшой тонкий момент о пропущении аргументов конструктора.Если вы это сделаете, это всегда эквивалентно включению пустого списка аргументов - но это , а не , что эквивалентно вызову конструктора без параметров.Например, могут быть необязательные параметры или массивы параметров:

using System;
class Test
{
    int y;

    Test(int x = 0)
    {
        Console.WriteLine(x);
    }

    static void Main()
    {
        // This is still okay, even though there's no geniune parameterless
        // constructor
        Test t = new Test
        {
            y = 10
        };
    }
}
2 голосов
/ 02 марта 2011

Неа. Фактически, ReSharper будет жаловаться, что скобки безпараметрического конструктора с инициализатором являются избыточными. Они (очевидно) по-прежнему нужны, если вы использовали конструктор с одним или несколькими параметрами, но поскольку это не так, просто удалите их.

...