Я вижу, вы обновили свой вопрос, поэтому я обновлю свой ответ.Ваш вопрос состоит из двух частей, одна из которых относится к local variables
, а другая к instance variables on a class instance
.Во-первых, однако, это на самом деле не решение о проектировании компилятора, а решение о проектировании языка.
Spec Раздел 12.3.1 / 12.3.2
Локальные переменные
Мы знаем , почему вы можете определить переменную, не задавая ей значение.Одна из причин, пример чего-то вроде этого:
int x;
// do stuff
x = 5; // Wow, I can initialize it later!
Console.WriteLine(x);
Стандарт определяет, почему это допустимый код.Сейчас я не работаю в команде разработчиков C #, но есть смысл, почему они не будут автоматически инициализировать код для вас (кроме снижения производительности, когда вы на самом деле не хотели, чтобы он был автоматическиинициализировать).
Скажите, что код выше был вашим намерением, но вы забыли инициализировать x = 5;
.Если бы компилятор автоматически инициализировал переменную для вас, код скомпилировался бы, но он не сделал бы ничего, как вы ожидаете.
Конечно, это тривиальный пример, но это было очень хорошо дизайнерское решение от языковых дизайнеров, так как это избавило бы от многих головных болей, пытающихся выяснить, почему что-то не работает, как ожидалось.
В качестве примечания, я не могу придумать причину, по которой вы хотели бы определить код, не назначая ему что-либо, или использовать для меня значение по умолчанию (в каждом случае), которое, вероятно, будетошибка, которую, я уверен, это то, что могли определить разработчики компилятора.
Переменные экземпляра класса
Члены уровня класса определяются стандартом, который должен быть изначально назначен.На самом деле, чтобы быть справедливым, локальные переменные вне тех, которые объявлены в операторе catch
, foreach
или using
, изначально не назначены.Так что на самом деле это проблема стандартов, а не проблема компилятора.
Если бы я попытался догадаться, почему это так в отношении переменных экземпляра экземпляров класса, я бы сказал, что это связано с тем, какпамять распределяется в куче, поскольку именно там размещаются классы.Когда класс выделяется в куче, все его члены должны быть инициализированы и размещены вместе с ним в куче.Это не просто нормально делать в члене класса, чем в локальной переменной, для этого имеет , который должен быть выполнен таким образом.Их просто нельзя оставить без присмотра.