У меня сложилось впечатление, что во время выполнения не существует действительно "неназначенных" значений. В частности, что ссылочный тип, который не инициализирован, всегда будет иметь нулевое значение, а не значение, оставшееся от предыдущего вызова метода или случайного значения. Это правильно?
Замечу, что на ваш вопрос еще никто не ответил.
Ответ на вопрос, который вы на самом деле задали, - "Сорта".
Как уже отмечали другие, некоторые переменные (элементы массива, поля и т. Д.) Классифицируются как автоматически «изначально присвоенные» их значению по умолчанию. (Что является нулевым для ссылочных типов, ноль для числовых типов, false для bools и естественной рекурсии для пользовательских структур).
Некоторые переменные не классифицируются как изначально присвоенные; локальные переменные, в частности, изначально не назначаются. Они должны быть классифицированы компилятором как «точно назначенные» во всех точках, где используются их значения .
Тогда ваш вопрос фактически таков: «является ли локальная переменная, которая классифицируется как , ей определенно не присваивается на самом деле изначально присваивается так же, как поле?» И ответ на этот вопрос да , на практике среда выполнения изначально назначает всех локальных пользователей.
Это имеет несколько хороших свойств. Во-первых, вы можете наблюдать их в отладчике, чтобы они находились в состоянии по умолчанию перед их первым назначением. Во-вторых, нет никаких шансов, что сборщик мусора будет обманут в разыменовании неверного указателя только потому, что в стеке остался мусор, который теперь обрабатывается как управляемая ссылка. И так далее.
Во время выполнения разрешено оставлять исходное состояние местных жителей, как если бы мусор был там, если он может сделать это безопасно. Но, как деталь реализации, он никогда не выбрал это. Он обнуляет память для локальной переменной агрессивно.
Причина, по которой правило о том, что местные жители должны быть однозначно назначены до их использования, это , а не , чтобы вы не могли наблюдать неинициализированное состояние локального мусора. Это уже ненаблюдаемо, потому что CLR агрессивно очищает локальные значения до значений по умолчанию, так же как и для полей и элементов массива. Причина, по которой это недопустимо в C #, заключается в том, что использование неназначенного локального файла имеет высокую вероятность быть ошибкой. Мы просто делаем его недопустимым, и затем компилятор предотвращает возникновение такой ошибки.