Константы и поля

Константы

Константа (constant) - идентификатор, значение которого никогда не изменится. Значение должно определяться во время компиляции. Затем значение сохраняется в метаданных модуля. Константы могут быть только примитивных типов. Также константой может быть не примитивный тип, но с присвоением ей null. Константы считаются статическими членами.

Встретив в исходном коде имя константы, компилятор просматривает метаданные и вставляет в IL-код её значение. Память для констант не выделяется, потому что они хранятся в коде.

Если константа определена в другой сборке, то придётся заново компилировать обе сборки.

Поля

Поле (field) - член данных, который хранит экземпляр значимого типа или ссылку на объект ссылочного типа.

Термин CLRТермин C#Описание
StaticstaticПоле является частью состояния типа
Instance(по умолчанию)Поле связано с экземпляром типа
InitOnlyreadonlyЗапись в поле разрешается только из конструктора
VolatilevolatileКод, обращающийся к полю, не должен оптимизироваться компилятором, CLR или оборудованием с целью обеспечения безопасности потоков.

Динамическая память для хранения поля типа выделяется в пределах объекта-типа, который создаётся при загрузке типа в домен приложения. Память для экземплярных полей выделяется при создании экземпляра.

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

Проблему с константами в разных версиях DLL можно решить через поля только для чтения, которые бы инициализировались в конструкторе, а не на этапе компиляции.

В C# есть возможность инициализации поля на месте (inline), что является сокращённой записью инициализации поля через конструктор.

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