Нулевая ссылка Visual Studio, предупреждающая - почему никакая ошибка?

притон мерзавца является самым полезным для меня для перемещения изменений not-yet-checked-in прочь в другом ответвлении, чем то, которое в настоящее время проверяется.

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

5
задан Tesserex 11 September 2009 в 20:52
поделиться

4 ответа

Первый пример (ошибка) - это пример отслеживания определенного присваивания компилятора, который применяется только к локальным переменным. Из-за ограниченного контекста у компилятора есть надежда на эту ситуацию. Обратите внимание, что s не является нулевым, это не определено.

Во втором примере s является полем (и по умолчанию имеет значение null). Ошибка компилятора отсутствует, но она всегда будет обнаружена во время выполнения. Этот конкретный случай может быть перехвачен, но такого рода ошибки обычно не обнаруживаются компилятором.
Например, вы можете добавить метод Bar2 () , который присваивает строку s , но вызывать его позже, чем Bar () , или не вызывать вообще. Это устранило бы предупреждение, но не ошибку времени выполнения.

Так оно и было задумано.

8
ответ дан 13 December 2019 в 19:31
поделиться

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

  • . Компилятор не на 100% правильный. «S» может иметь ненулевое значение, если экземпляр изменен посредством отражения.
  • Программа может выполняться без ошибок, если никогда не вызывается метод Bar
  • Эта программа может быть тестовой программой, которая вызывает исключение NullReferenceException по причинам тестирования
3
ответ дан 13 December 2019 в 19:31
поделиться

Единственное, что я могу сделать, это то, что во втором примере s можно было изменить через отражение (используя BindingFlags.Private для доступа к закрытому члену).

0
ответ дан 13 December 2019 в 19:31
поделиться

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

В вторая, s - глобальная переменная, и возможно, она была инициализирована где-то еще в классе.

0
ответ дан 13 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: