Есть ли причина, по которой NullReferenceException не дает имя переменной? - PullRequest
10 голосов
/ 10 марта 2011

ArgumentNullException имеет свойство ParamName, указывающее, какой аргумент был передан как ноль.

Почему NullReferenceException не имеет аналогичного свойства? Было бы технически возможно реализовать в .Net?

Ответы [ 2 ]

9 голосов
/ 10 марта 2011

A NullReferenceException выбрасывается CLR при попытке перейти по нулевой ссылке.Это не обязательно связано с переменной, и, в частности, CLR действительно не заботится о том, откуда она взялась - это просто значение в стеке.

Сравните это с ArgumentNullException, равным явно выдается с помощью кода, такого как:

if (foo == null)
{
    throw new ArgumentNullException("foo");
}

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

1 голос
/ 10 марта 2011

ОК, я знаю, что Джон опубликовал хороший ответ, но вот еще немного информации.

Имя переменной никогда не компилируется в IL.(Я был изначально не уверен, но проверил) Так что для CLR, это просто ссылка, поэтому он не будет знать, какое у него имя, и , он даже не будет знать его тип , так как это нулевой указательи информация о типе извлекается из указателя типа каждого объекта в куче (получение информации о типе для ValueTypes требует их упаковки).

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

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