Я хотел бы знать, должен ли я попытаться предпочесть их нормальным конструкторам во всех других случаях.
Я бы сказал, нет.
Конструкторы имеют огромное количество преимуществ. Используя конструктор, компилятор обеспечит соблюдение всех необходимых данных для вашего типа. Это означает, что вы можете сделать невозможным создание экземпляра вашего типа, который находится в недопустимом состоянии, что позволяет проактивно предотвратить многие ошибки.
Инициализаторы объектов, с другой стороны, создают множество недостатков. Вы должны предоставлять общедоступные свойства для любых данных, необходимых для инициализации. Они не требуются во время строительства, поэтому пользователи вашего типа могут случайно опустить некоторые данные.
В общем, что-то требуется для вашего класса в функции должно быть необходимо в конструкторе. Инициализаторы объектов все еще можно использовать, даже если у вас есть пользовательский конструктор, но его следует использовать только для данных, которые являются необязательными при настройке в вашем классе. Смешивание как в инициализации в порядке, а это означает, что вы можете сделать:
var yourInst = new YourClass(req1, req2) { OptionalProperty = opt1 }
Это может помочь уменьшить количество конструкторов перегрузок требуется (по аналогии с использованием optional arguments, но без некоторых недостатков версий в дополнительных аргументах).
http://stackoverflow.com/questions/740658/whats-the-difference-between-an-object-initializer-and-a-constructor – dugas
Это может быть несколько субъективно. Получил неизменный тип? Объект, который должен инкапсулировать состояние? Объект объявляет инъекционные зависимости? Предпочитают конструктор. Получил простой (но изменяемый) DTO? Не стесняйтесь использовать синтаксис инициализатора. Используйте инструмент, который имеет смысл для того, что вы пытаетесь выполнить. –
Даже в простой DTO я все равно использую аргументы конструктора для чего-либо * required * для класса. –