Подтвердить что ты не робот

Сложность инициализатора объекта #. передовая практика

Я был слишком взволнован, когда в С# появился инициализатор объектов.

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Примечание: я не делаю этого сам, поэтому будьте осторожны в моем (возможно) ужасном стиле, отличном от стиля.

Ответ 3

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

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

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

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