Язык C # требует, чтобы все переменные были точно назначены до того, как они будут прочитаны. Локальные переменные считаются изначально неназначенными , тогда как поля, элементы массива и т. Д. Считаются , изначально присвоенными их значению по умолчанию . (Что для ссылочного типа равно нулю.)
Нет технической причины, по которой мы не могли бы обрабатывать локальные переменные как изначально присвоенные их значениям по умолчанию и отбрасывать всю проверку определенного присваивания. Это происходит потому, что использование неназначенного local в качестве значения по умолчанию является (1) плохой практикой кодирования и (2) весьма вероятным источником раздражающих ошибок. Требуя от вас явного назначения локальных переменных перед их использованием, мы предотвращаем использование недопустимой практики и устраняем целый класс ошибок, которые вам никогда не придется отлаживать.
Также учтите следующее:
while(whatever)
{
int i;
print(i);
i = i + 1;
}
Ожидаете ли вы, что я буду хранить его значение во время выполнения цикла или для того, чтобы он каждый раз инициализировался с нуля? Вынуждая вас явно инициализировать его, вопрос становится бессмысленным, и это различие, которое не имеет значения.
(Кроме того, в приведенном выше случае возможна небольшая потенциальная оптимизация производительности, поскольку компилятор может повторно использовать переменную без необходимости генерировать код для очистки ее содержимого, поскольку компилятор знает, что вы очистить содержимое.)
Я не знаю, как ответить на ваш второй вопрос, потому что я не знаю, что вы подразумеваете под «работой». Можете ли вы сказать мне, как присваивать "int x = 123;" работает? Как только я пойму, что вы подразумеваете под «работами», я могу описать, как работает присвоение нуля переменной ссылочного типа.