Стили: "инициализатор объекта" против "конструктора" создание объектов


Вопрос: каковы предпочтения людей между двумя способами создания объекта (в C# в частности) и устанавливать другие поля (которые не могут быть заданы значения во время строительства)? Либо из них является лучшей практикой? или это до программиста и никаких конвенций стиль в компании?

Мои предпочтения абсолютно для метод инициализатора объекта. Это выглядит намного чище и лаконичнее меня.

Инициализатор объекта

Type T = new Type(Param1, Param2)
{
    Field1 = Value1,
    Field2 = Value2,
    Field3 = ValueFromFunction()    
};

Конструктор

Type T = new Type(Param1, Param2);
T.Field1 = Value1;
T.Field2 = Value2;
T.Field3 = ValueFromFunction();


13611
14
задан 23 августа 2011 в 09:08 Источник Поделиться
Комментарии
2 ответа

Обе эти технологии рождаются разные цели.

Стиль конструктора является то, что вы дизайн ваших занятий, если вы хотите им быть искусственной-неизменный, то есть, вы не хотите их изменить после строительства, так что вы сделать сеттеры на защищаемые свойства или частная.

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

Одним из крупнейших факторов решение здесь таково: объект безопасно использовать в случае, если свойства имеют значение null?

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

Примером этого может быть объектом класса String, что каталог базы данных не может быть безопасно использоваться в качестве все, что пытались использовать его будут пытаться использовать базу каталога и может бросить исключение, если он имеет значение null.

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

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

Редактировать:
Все, что сказал, как используя синтаксис инициализатора, когда они имеются, это действительно просто сахар и я думаю, что все согласятся, что вы должны использовать его, если вы знаете количество значений во время строительства.

11
ответ дан 23 августа 2011 в 12:08 Источник Поделиться

Метод, который вы звоните сюда "конструктора" не правильного "конструктора" до инициализации объекта. Тем не менее, по моему опыту, большинство, если не все люди предпочитают инициализации конструктором, но я имею в виду не одного показанного вами. Конструктор должен принимать значения для инициализации параметров, как это:

Type T = new Type(Value1, Value2, ValueFromFunction());

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

3
ответ дан 23 августа 2011 в 11:08 Источник Поделиться