притон мерзавца является самым полезным для меня для перемещения изменений not-yet-checked-in прочь в другом ответвлении, чем то, которое в настоящее время проверяется.
, Например - я часто делаю простые изменения на ответвлении исправлений ошибок; только найти, что изменение я продолжаю работать, более сложно, чем я сначала предположил. Притон мерзавца является самым легким способом переместить тот набор изменений в другом ответвлении.
Первый пример (ошибка) - это пример отслеживания определенного присваивания компилятора, который применяется только к локальным переменным. Из-за ограниченного контекста у компилятора есть надежда на эту ситуацию. Обратите внимание, что s
не является нулевым, это не определено.
Во втором примере s
является полем (и по умолчанию имеет значение null). Ошибка компилятора отсутствует, но она всегда будет обнаружена во время выполнения. Этот конкретный случай может быть перехвачен, но такого рода ошибки обычно не обнаруживаются компилятором.
Например, вы можете добавить метод Bar2 ()
, который присваивает строку s
, но вызывать его позже, чем Bar ()
, или не вызывать вообще. Это устранило бы предупреждение, но не ошибку времени выполнения.
Так оно и было задумано.
Для второго примера код действителен, он просто может работать некорректно. Вот несколько случаев, когда эта программа могла выполняться «успешно»
Единственное, что я могу сделать, это то, что во втором примере s можно было изменить через отражение (используя BindingFlags.Private для доступа к закрытому члену).
В первом примере s является локальной переменной, и компилятор может легко проверить, что переменная s не была назначена до ее использования.
В вторая, s - глобальная переменная, и возможно, она была инициализирована где-то еще в классе.