Ответ
Эти модификаторы решают разные задачи, связанные с областью видимости, временем инициализации и принадлежностью данных.
const (константа времени компиляции)
- Значение должно быть известно на этапе компиляции.
- Инициализация: Только при объявлении.
- Неявно
static: Обращение через имя класса:ClassName.ConstName. - Типы данных: Только встроенные типы (
int,double,bool,char,string). - Пример:
public class MathConstants { public const double Pi = 3.14159; public const string AppName = "MyApp"; } // Использование: double circumference = 2 * MathConstants.Pi * radius;
readonly (константа времени выполнения)
- Значение может быть вычислено во время выполнения.
- Инициализация: При объявлении или в конструкторе класса (для полей экземпляра).
- Может быть
staticили нет. - Типы данных: Любые.
-
Пример:
public class AppService { public readonly DateTime StartTime = DateTime.Now; // Инициализация при объявлении private readonly ILogger _logger; public AppService(ILogger logger) { _logger = logger; // Инициализация в конструкторе } }
static (принадлежность типу)
- Указывает, что член (поле, свойство, метод) принадлежит самому типу (классу), а не его экземплярам.
- Комбинируется с
readonly:static readonly— распространённая практика для констант времени выполнения на уровне класса. -
Пример:
public class Configuration { // Константа времени выполнения, общая для всех экземпляров и потоков. public static readonly string ConnectionString = LoadFromConfig(); public static int InstanceCount { get; private set; } // Статическое свойство public Configuration() { InstanceCount++; } }
| Сводная таблица: | Критерий | const |
readonly (поле экземпляра) |
static readonly |
|---|---|---|---|---|
| Время инициализации | Компиляция | Выполнение (в конструкторе) | Выполнение (статический конструктор) | |
| Принадлежность | Классу (static) |
Экземпляру класса | Классу (static) |
|
| Допустимые типы | Примитивы, string |
Любые | Любые | |
| Изменяемость | Никогда | Только в конструкторе | Только в статическом конструкторе |