2010-06-18 2 views
21

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

MyClass a = new MyClass(); 
a.Field1 = Value1; 
a.Field2 = Value2; 

можно переписать короче:

MyClass a = new MyClass { Field1 = Value1, Field2 = Value2 } 

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

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

Как вы используете инициализатор объектов для сложного назначения, или это плохая практика, чтобы использовать десятки настроек?

Заранее благодарю вас!

ответ

17

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

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

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

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

+1

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

+0

Я склонен не любить инициализаторы объектов в DAO, потому что вы обычно получаете поле от читателя, и часто есть что-то, что может пойти не так. Вы не получаете никакой безопасности компилятора. В этом случае вы не можете защитить себя единичным тестом, потому что это станет интеграционным тестом. У объектов из БД обычно есть несколько связанных с ними полей. Однако, если назначения тривиальны, я буду использовать инициализатор объекта. – uriDium

0

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

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

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

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

+0

«вам не следует возиться с хорошо проверенным и рабочим кодом, чтобы упростить его чтение» - использование инициализатора объекта - один из самых безопасных рефакторингов. Вы не фанат рефакторинга вообще? –

+0

Да, Джон, я очень с тобой согласен с этим. Рефакторинг, где это имеет смысл. Если есть повышение производительности, и если код можно сделать более безопасным и надежным. Разумеется, изменение типов, подлежащих вытеснению, как вы упомянули в своем ответе, является наилучшей практикой. Но просто рефакторинг для использования инициализаторов объектов нередко является хорошим использованием чьего-либо времени. –

+0

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

3

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

Однако, если разделить задание на несколько строк, я думаю, что VS будет указывать на прямую линию, когда исключение:

MyClass a = new MyClass { 
        Field1 = Value1, 
        Field2 = Value2 }; 

Примечания: Я не делаю это сам, так нежен о моем (возможно) ужасном стиле.

+1

Нет, нет :) Моя студия выделяет все строки инициализатора объекта при возникновении ошибки, и я не знаю, какое свойство имеет проблему. –

+0

Я вижу. Тогда, я думаю, для целей отладки это своего рода бремя, если вы не хотите наводить курсор на каждое выражение, которое вы назначаете полям, и посмотреть, какой из них является нулевым. – ErikHeemskerk

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