C #, насколько я могу судить, сохранил много вещей, как это было в других предыдущих языках, в основном C ++.
Причина в C ++ (которая может относиться или не относиться к C #) состоит в том, что статические (или глобальные) объекты статически записываются в исполняемый файл или библиотеку, тогда как для других объектов код, который создает объект (а не сам объект) ) записывается в исполняемый файл или библиотеку. Для объектов в стеке обычно пишется код, который вычитает некоторое значение из указателя стека.
Когда исполняемый файл или библиотека загружаются в память операционной системой, статические поля представляют собой просто набор байтов, которые копируются как есть в память (сегмент данных процесса). Поскольку они копируются как есть, они уже имеют значение (значение в исполняемом файле или файле библиотеки). Из-за этого нет никаких проблем с производительностью для установки его на конкретное значение. По этой причине (насколько я вижу) стандарт C ++ сделал их значение детерминированным (если они не инициализированы явно), и что является более естественным, чем ноль, в качестве значения инициализации?!
Чтобы инициализировать динамический объект (находится ли он в стеке или в куче), код должен быть вставлен в исполняемый файл или библиотеку. Это влияет на производительность (и, возможно, другие значения), поэтому стандарт C ++ предпочел оставить это на усмотрение программиста.
Я не совсем уверен, что каждый бит этих данных верен, но это то, что мне кажется логичным из того, что я знаю.