Константы и поля
Константы
Константа (constant) - идентификатор, значение которого никогда не изменится. Значение должно определяться во время компиляции. Затем значение сохраняется в метаданных модуля. Константы могут быть только примитивных типов. Также константой может быть не примитивный тип, но с присвоением ей null. Константы считаются статическими членами.
Встретив в исходном коде имя константы, компилятор просматривает метаданные и вставляет в IL-код её значение. Память для констант не выделяется, потому что они хранятся в коде.
Если константа определена в другой сборке, то придётся заново компилировать обе сборки.
Поля
Поле (field) - член данных, который хранит экземпляр значимого типа или ссылку на объект ссылочного типа.
| Термин CLR | Термин C# | Описание |
|---|---|---|
| Static | static | Поле является частью состояния типа |
| Instance | (по умолчанию) | Поле связано с экземпляром типа |
| InitOnly | readonly | Запись в поле разрешается только из конструктора |
| Volatile | volatile | Код, обращающийся к полю, не должен оптимизироваться компилятором, CLR или оборудованием с целью обеспечения безопасности потоков. |
Динамическая память для хранения поля типа выделяется в пределах объекта-типа, который создаётся при загрузке типа в домен приложения. Память для экземплярных полей выделяется при создании экземпляра.
Поля могут быть как измененяемыми, так и доступными только для чтения, инициализируемыми через конструктор. Компилятор и механизм верификации гарантируют, что ни один метод кроме конструктора не сможет записать данные в это поле. Но для изменения такого поля можно задействовать рефлексию.
Проблему с константами в разных версиях DLL можно решить через поля только для чтения, которые бы инициализировались в конструкторе, а не на этапе компиляции.
В C# есть возможность инициализации поля на месте (inline), что является сокращённой записью инициализации поля через конструктор.
Неизменность поля ссылочного типа означает неизменность ссылки, которую этот тип содержит, а вовсе не объекта, на которую указывает ссылка.
