В чем разница между инициализатором объекта и конструктором? - PullRequest
157 голосов
/ 11 апреля 2009

В чем различия между ними и тем, когда вы будете использовать «инициализатор объекта» над «конструктором» и наоборот? Я работаю с C #, если это имеет значение. Кроме того, метод инициализатора объекта специфичен для C # или .NET?

Ответы [ 5 ]

221 голосов
/ 11 апреля 2009

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

Конструкторы запускаются с заданным 0 или более параметрами и используются для создания и инициализации объекта до , вызывающий метод получает дескриптор созданного объекта. Например:

MyObject myObjectInstance = new MyObject(param1, param2);

В этом случае конструктор MyObject будет работать со значениями param1 и param2. Они оба используются для создания нового MyObject в памяти. Созданный объект (который настраивается с использованием этих параметров) возвращается и устанавливается на myObjectInstance.

Как правило, считается, что конструктору требуются параметры, необходимые для полной настройки объекта, чтобы создать объект в недопустимом состоянии.

Однако часто существуют «дополнительные» свойства, которые можно установить, но они не обязательны. Это может быть обработано с помощью перегруженных конструкторов, но приводит к тому, что в большинстве случаев оказывается множество конструкторов, которые не всегда полезны.

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

MyObject myObjectInstance = new MyObject(param1, param2)
{
    MyProperty = someUsefulValue
};

Это будет вести себя примерно так же, как если бы вы это делали:

MyObject myObjectInstance = new MyObject(param1, param2);
myObjectInstance.MyProperty = someUsefulValue;

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

Кроме того, инициализаторы объектов проще для чтения (особенно когда вы задаете несколько значений), поэтому они дают вам то же преимущество, что и многие перегрузки конструктора, без необходимости много перегрузок, усложняющих API для этого класса.

43 голосов
/ 11 апреля 2009

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

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

Вы бы использовали конструктор без помощи инициализатора объекта, если конструктор в достаточной мере установил начальное состояние объекта. Однако инициализатор объекта должен использоваться вместе с конструктором. Синтаксис требует явного или неявного использования (VB.Net и C #) конструктора для создания исходного объекта. Вы бы использовали инициализатор объекта, когда конструктор недостаточно инициализирует объект для вашего использования, и это могут сделать несколько простых наборов полей и / или свойств.

24 голосов
/ 31 мая 2013

Когда вы делаете

Person p = new Person { Name = "a", Age = 23 };

Вот что по сути делает инициализатор объекта:

Person tmp = new Person(); //creates temp object calling default constructor
tmp.Name = "a";
tmp.Age = 23;
p = tmp;

Теперь это облегчает поведение, подобное this . Важно знать, как работают инициализаторы объектов.

14 голосов
/ 11 апреля 2009

Если у вас есть свойства, которые ДОЛЖНЫ быть установлены для вашего объекта, чтобы он работал должным образом, один из способов - предоставить только один конструктор, который требует эти обязательные свойства в качестве параметров.

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

Инициализаторы объектов - это просто "синтаксическое удобство" для сокращения начальных назначений. Хороший, но не очень функционально релевантный.

Марк

4 голосов
/ 11 апреля 2009

Конструктор - это метод (возможно), принимающий параметры и возвращающий новый экземпляр класса. Может содержать логику инициализации. Ниже вы можете увидеть пример конструктора.


public class Foo
{
    private SomeClass s;
    public Foo(string s)
    {
       s = new SomeClass(s);
    }
}

Теперь рассмотрим следующий пример:


public class Foo
{
    public SomeClass s { get; set; }
    public Foo() {}
}

Вы можете достичь того же результата, что и в первом примере, используя инициализатор объекта, предполагая, что вы можете получить доступ к SomeClass, с помощью следующего кода:


new Foo() { s = new SomeClass(someString) }

Как видите, инициализатор объекта позволяет вам указывать значения для открытых полей и общедоступных (устанавливаемых) свойств одновременно с созданием, и это особенно полезно, когда конструктор не предоставляет никакой перегрузки, инициализирующей определенные поля. Обратите внимание, однако, что инициализаторы объектов являются просто синтаксическим сахаром и что после компиляции действительно не будет отличаться от последовательности присваиваний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...