#c# #visual-studio #c#-4.0 #visual-studio-2019 #visual-studio-debugging
Вопрос:
Допустим, я одновременно инициализирую новый объект, обладающий множеством свойств. Один из них вызывает исключение нулевой ссылки, но при использовании отладчика он проходит сразу через весь блок инициализации кода. Есть ли простой способ определить, какое свойство вызвало ошибку. Обратите внимание, что свойства объекта могут быть разных типов, поэтому некоторым типам разрешено быть нулевыми.
инициализация бывшего объекта
var obj = new Obj{ prop1 = x, prop2 = y, prop3 = f, prop4 = r, prop5 = h, prop6 = k, prop7 = w, prop8 = l, prop8 = m, prop9 = e, prop10 = a };
Одно из этих свойств вызвало исключение нулевой ссылки, но вы не знаете, какое именно, и отладчик прошел через весь блок сразу. Есть ли способ идентифицировать это с помощью visual studio?
Комментарии:
1. Свойства не вызывают NRE, если только они не содержат логики в сеттере. На самом ли деле это один из ваших
x
,y
,f
, … обращений, который на самом деле является разыменованием null (так что вы действительно используетеx.Foo
)?2. Насколько мне известно, нет. Это одна из самых неприятных вещей, связанных с инициализацией свойств. Вы можете заменить его (даже временно) назначениями свойств по одному (при условии, что это свойства get;set; и не get;init;) .
3. @CodeCaster это всего лишь пример объекта, многие объекты, с которыми я работаю, могут содержать более 50 свойств и вложенных объектов
4. Да, значит, ваши x, y, f-это упрощенные примеры, которые на самом деле не воспроизводят вашу проблему?
5. ну, проблема в том, что то же самое может произойти и в этом точном блоке кода, если они являются нулевыми свойствами. Это общая проблема, с которой мы сталкиваемся при разработке
Ответ №1:
Установите точку останова для назначения obj
и откройте окно «Локальные». Обратите внимание на значения переменных, которым вы присваиваете свойства obj
. Кроме того, в самой Visual Studio не так много встроенного, чтобы помочь вам в этом отношении (о чем я знаю или могу вспомнить в данный момент), кроме подсказок.
Это самый большой недостаток инициализаторов объектов и списков. Если вы назначаете множество свойств, исключение создается в первой строке блока инициализации, как вы заметили. Это невероятно раздражает и может затруднить отслеживание.
Если вам посчастливилось использовать довольно продвинутый аддон для рефакторинга (например, Resharper или CodeRush), должен быть рефакторинг для преобразования инициализатора объекта в прямое назначение свойств и обратно. Это позволит вам преобразовать инициализатор объекта в назначения свойств, отладить код, чтобы можно было быстро изолировать постановку проблемы, устранить ее, а затем преобразовать код обратно в инициализатор объекта.
Ответ №2:
Рассмотрите возможность проверки вашего браузера и обратите внимание, какое свойство пусто. Мой совет
Комментарии:
1. Не понимаю, как это можно назвать ответом на вопрос..