Инициализаторы объектов были добавлены в 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 для этого класса.