2013-03-21 3 views
2

Я только что узнал об инициализаторах объектов и задавался вопросом, что лучше всего использовать для их использования.Должен ли я использовать инициализатор объекта или конструктор?

Это то, что я читал о них: http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx Он ясно показывает, что они необходимы для создания анонимных типов, но я хотел бы знать, следует ли мне стараться предпочесть их нормальным конструкторам во всех других случаях.

+0

http://stackoverflow.com/questions/740658/whats-the-difference-between-an-object-initializer-and-a-constructor – dugas

+5

Это может быть несколько субъективно. Получил неизменный тип? Объект, который должен инкапсулировать состояние? Объект объявляет инъекционные зависимости? Предпочитают конструктор. Получил простой (но изменяемый) DTO? Не стесняйтесь использовать синтаксис инициализатора. Используйте инструмент, который имеет смысл для того, что вы пытаетесь выполнить. –

+0

Даже в простой DTO я все равно использую аргументы конструктора для чего-либо * required * для класса. –

ответ

1

В настоящее время я вижу следующие проблемы, связанные с их использованием:

  1. свойства, которые назначены должен быть изменчивы. Это кажется нежелательным, потому что, если данные передаются конструктору, я могу проверить его там и сделать создание объекта неудачным, если предоставленные данные недостаточны или неправильны. Если данные могут быть присвоены свойству I , то вам придется выяснить, что такое состояние моего объекта: все создано должным образом или какое-либо другое состояние может быть in.
  2. Свойства, которые назначены, должны иметь быть публичным. Это означает, что доступ к вещам, которые в противном случае были бы частными, должен быть раскрыт, а затем ограничен ограниченным использованием интерфейса или что-то в этом роде.

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

+0

Я согласен с этим ИСКЛЮЧЕНИЕМ, если вы используете класс строителя, чтобы инициализировать частный конструктор неизменяемого класса. Тогда все в порядке. Разумеется, это нормально для вещей с узким пространством. –

+0

Единственный способ создания объекта с ошибкой - это выбросить исключение. – Bobson

+1

Как сказал Мики, вы путаете вещи. Инициализаторы объектов должны использоваться только для создания более чистого кода. Вы все еще пишете один и тот же базовый код, именно так он используется. См. Ответ Рида в ссылке, сделанной @dugas –

10

Я считаю, что вы путаете вещи.

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

Если вам интересно об Инициализаторах объектов для класса, который вы разрабатываете, то ответ по-прежнему применяется. Обязательно предоставляйте необходимые конструкторы, которые имеют смысл. Вам не нужно ничего делать, чтобы включить/разрешить инициализаторы объектов. Они представляют собой синтаксический сахар, предоставляемый компилятором C# с версии 3.0, и позволяют пользователям вашего класса инициализировать публичных членов вашего класса сразу после его создания.

+0

Таким образом, использование инициализатора объекта вызовет конструктор по умолчанию. – Zapnologica

+0

Да, либо стандартный, либо специализированный конструктор, соответствующий вашему инициализатору. –

4

Хорошее эмпирическое правило:

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

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

18

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

Я бы сказал, нет.

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

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

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

var yourInst = new YourClass(req1, req2) { OptionalProperty = opt1 } 

Это может помочь уменьшить количество конструкторов перегрузок требуется (по аналогии с использованием optional arguments, но без некоторых недостатков версий в дополнительных аргументах).

Смежные вопросы