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

Почему бы не исключить исключения ссылочной ошибки в .net, скажите мне, какой объект был нулевым?

Возможно, задание вопроса предает мою нехватку знаний о процессе, но опять же, нет никаких оснований спрашивать!

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

Что здесь происходит под капотом? Это потому, что имена переменных не объединены в исполняемый файл?

4b9b3361

Ответ 1

.NET-код построен с полной оптимизацией и без отладочной информации: ваши локальные имена переменных исчезли, некоторые локальные переменные, возможно, были полностью устранены.

.NET-код, построенный с полной оптимизацией + PDB (или полная отладка): большинство локальных имен переменных сохранены, возможно, были устранены некоторые локальные переменные

Нет оптимизаций + нет информации об отладке: имена локальных переменных отсутствуют.

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

Ответ 2

В основном вы ответили на свой вопрос. Когда вы компилируете код, он преобразуется на промежуточном языке (IL). IL не имеет имен переменных так, как ваш код делает, аргументы вызываемого метода вставляются в стек перед вызовом метода, а аргументы методов токов и локальные переменные упоминаются там. Я считаю, что это связано с тем, что эта структура помогает компилятору JIT генерировать код.

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

Надеюсь, что это поможет, Rob

Ответ 3

Нет идентификатора объекта. Нельзя сказать, что .NET мог сказать: "Объект с идентификатором xxxx равен null".

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