Расширяя ответ Марка, инициализация локальной переменной также связана с процессом проверки .
CLI требует, чтобы в любом проверяемом коде (то есть в модулях, которые явно не просили пропустить процесс проверки с помощью свойства SkipVerfication из атрибута SecurityPermission ), все локальные переменные должны быть инициализированы до того, как они использование. В противном случае будет выдано VerficationException .
Более интересно то, что компилятор автоматически добавляет флаг .locals init
в каждый метод, который использует локальные переменные. Этот флаг заставляет JIT-компилятор генерировать код, который инициализирует все локальные переменные их значениями по умолчанию. Это означает, что даже если вы уже инициализировали их в своем собственном коде, JIT будет соблюдать флаг .locals init
и сгенерирует правильный код инициализации. Эта «дублирующая инициализация» не влияет на производительность, поскольку в конфигурациях, которые допускают оптимизацию, JIT-компилятор обнаружит дублирование и будет эффективно рассматривать его как «мертвый код» (автоматически сгенерированная процедура инициализации не будет отображаться в сгенерированных инструкциях на ассемблере).
По словам Microsoft (также при поддержке Эрика Липперта в ответ на вопрос в своем блоге), в большинстве случаев, когда программисты не инициализируют свою локальную переменную, они этого не делают, потому что они передают на основной среда для инициализации их переменной значениями по умолчанию, но только потому, что они «забыли», таким образом, вызывая иногда иллюзорные логические ошибки.
Таким образом, чтобы уменьшить вероятность появления ошибок такого рода в коде C #, компилятор по-прежнему настаивает на том, чтобы вы инициализировали свои локальные переменные. Даже при том, что он собирается добавить флаг .locals init
к сгенерированному IL-коду.
Более подробное объяснение по этому вопросу можно найти здесь: Позади .locals init Flag