Могут ли в интерфейсе C# быть поля (fields)?

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

Ответ

Нет, интерфейсы в C# не могут содержать поля экземпляра (instance fields). Они определяют контракт — набор членов, которые реализующий класс должен предоставить, а поля относятся к внутренней реализации.

Что может содержать интерфейс:

  • Методы (включая методы расширения)
  • Свойства (автореализуемые или с явными get/set-аксессорами)
  • События (event)
  • Индексаторы (this[])

Пример допустимого содержимого интерфейса:

public interface ILoggable
{
    // Свойство — это допустимо (по сути, методы get/set).
    string Id { get; }

    // Метод — это допустимо.
    void Log(string message);

    // Событие — это допустимо.
    event EventHandler OnLogged;

    // Статическое поле/константа — допустимо (начиная с C# 8.0).
    static readonly string DefaultCategory = "General";
    const int MaxEntries = 1000;
}

Почему поля недопустимы? Поле — это данные. Разрешение полей в интерфейсе означало бы навязывание конкретной реализации хранения данных, что нарушает принцип абстракции. Если вам нужно обязать реализующий класс иметь определенное поле, используйте абстрактный класс.

// Абстрактный класс МОЖЕТ содержать поля.
abstract class AbstractExample
{
    protected int _value; // Поле — допустимо.
}

Важно: Начиная с C# 8.0, интерфейсы поддерживают статические члены, включая статические поля и методы, но это по-прежнему не поля экземпляра.