Почему статические поля по умолчанию пусты? - PullRequest
1 голос
/ 06 января 2011

Просто любопытно, что из приведенного ниже кода я вижу, что статическое поле типа A будет по умолчанию пустым, а переменная этого типа должна быть инициализирована, чтобы иметь по крайней мере нулевое значение. Кто-нибудь может объяснить разницу немного больше? Спасибо

class Program
{
  static A _a;   //it is null by default
  static void Main(string[] args)
        {
          A nonStaticA; //empty reference, exception when used
          A correctA=null;
        }
}
class A
{
}

Ответы [ 4 ]

4 голосов
/ 06 января 2011

Начальное значение поля, , будь то статическое поле или поле экземпляра , является значением по умолчанию для типа поля. Невозможно наблюдать значение поля до того, как произойдет инициализация по умолчанию, и поэтому поле никогда не будет «неинициализировано».

Если в классе существует статический конструктор, выполнение инициализаторов статического поля происходит непосредственно перед выполнением этого статического конструктора. В противном случае инициализаторы статического поля выполняются во время, зависящее от реализации, до первого использования статического поля этого класса.

Локальная переменная не инициализируется автоматически и поэтому не имеет значения по умолчанию. Для проверки определенного присваивания локальная переменная считается изначально неназначенной.

2 голосов
/ 06 января 2011

Это не имеет ничего общего с static. Поля класса (instance и static) инициализируются по умолчанию, локальные переменные - нет.

А почему? Как и многие вещи, это было дизайнерское решение в какой-то момент.

1 голос
/ 06 января 2011

Разница между локальными переменными и полями , а не между статическими и экземплярами.

Локальные переменные любого типа должны быть инициализированы значением доони используются первыми.Это предотвращает ошибки, когда вы забываете инициализировать переменную.

Поля - это другое дело, так как может быть невозможно инициализировать все поля во время объявления.Например, начальное значение может зависеть от аргументов конструктора.Следовательно, поля не должны быть инициализированы явно, а если нет, получить значение по умолчанию для типа, которое равно null для всех ссылочных типов.

0 голосов
/ 06 января 2011

C #, насколько я могу судить, сохранил много вещей, как это было в других предыдущих языках, в основном C ++.

Причина в C ++ (которая может относиться или не относиться к C #) состоит в том, что статические (или глобальные) объекты статически записываются в исполняемый файл или библиотеку, тогда как для других объектов код, который создает объект (а не сам объект) ) записывается в исполняемый файл или библиотеку. Для объектов в стеке обычно пишется код, который вычитает некоторое значение из указателя стека.

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

Чтобы инициализировать динамический объект (находится ли он в стеке или в куче), код должен быть вставлен в исполняемый файл или библиотеку. Это влияет на производительность (и, возможно, другие значения), поэтому стандарт C ++ предпочел оставить это на усмотрение программиста.

Я не совсем уверен, что каждый бит этих данных верен, но это то, что мне кажется логичным из того, что я знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...