Могут ли в интерфейсе храниться константы?

«Могут ли в интерфейсе храниться константы?» — вопрос из категории ООП, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, могут. В C# интерфейсы могут содержать константы (const) и статические поля только для чтения (static readonly). Эти члены неявно являются public, static и sealed (для констант).

Практический пример:

public interface IAppSettings
{
    const int MaxRetryCount = 3;
    static readonly string DefaultCulture = "en-US";
    static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(30);
}

// Использование:
int maxTries = IAppSettings.MaxRetryCount;
string culture = IAppSettings.DefaultCulture;

Ключевые особенности:

  • Константы (const) компилируются непосредственно в вызывающий код как литеральные значения. Изменение значения константы требует перекомпиляции всех зависимых сборок.
  • Статические поля (static readonly) являются ссылками, их значения хранятся в памяти и могут быть инициализированы в статическом конструкторе.
  • Обращаться к ним можно только через имя интерфейса (IAppSettings.MaxRetryCount), а не через экземпляр класса.

Современная альтернатива (C# 8.0+): Для более гибкого дизайна API рассмотрите использование статических абстрактных членов в интерфейсах (feature static abstract в интерфейсах), которые позволяют определять контракты для статических членов, реализуемых классами.