В чём разница между модификаторами const, readonly и static в C#?

«В чём разница между модификаторами const, readonly и static в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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 Любые Любые
Изменяемость Никогда Только в конструкторе Только в статическом конструкторе