Ответ
Да, могут. В 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 в интерфейсах), которые позволяют определять контракты для статических членов, реализуемых классами.