Ответ
Константа (const) — это идентификатор, значение которого известно на этапе компиляции и не может быть изменено в течение всего времени жизни приложения.
Характеристики и синтаксис:
public const int MaxRetryCount = 3;
public const string ProductName = "MyApp";
public const double Pi = 3.14159;
Ключевые особенности const:
- Компиляция: Значение подставляется прямо в IL-код везде, где используется константа. Изменение константы требует перекомпиляции всех зависимых сборок.
- Типы данных: Могут быть только типами-значениями (
int,double,bool,enum),stringилиnull. - Область видимости: Неявно являются
static. Обращение:ClassName.ConstantName. - Инициализация: Должны быть проинициализированы при объявлении.
Когда использовать const?
Для истинно неизменяемых, фундаментальных значений, известных на этапе компиляции:
- Математические константы (
Math.PI— на самом делеstatic readonly, но концептуально). - Коды ошибок, магические числа.
- Фиксированные строки-идентификаторы.
Альтернатива: readonly поле
Используйте readonly, когда значение неизменно, но вычисляется в runtime (например, при создании объекта) или имеет недопустимый для const тип.
public class Config
{
// Значение можно задать в конструкторе или инициализаторе
public readonly DateTime StartupTime = DateTime.UtcNow;
public readonly List<string> SupportedLanguages;
public Config()
{
SupportedLanguages = LoadLanguages(); // runtime-инициализация
}
}
Сравнение const vs readonly: |
Критерий | const |
readonly |
|---|---|---|---|
| Время вычисления | Компиляция | Выполнение (runtime) | |
| Типы данных | Примитивы, string, enum |
Любые | |
Модификатор static |
Неявно статическая | Может быть как статическим, так и экземплярным | |
| Обновление значения | Требует перекомпиляции всех клиентов | Достаточно перекомпиляции только сборки, где объявлено поле |