К какому типу данных относится интерфейс в C#?

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

Ответ

В C# интерфейс (interface) является ссылочным типом (reference type). Это означает, что переменная, объявленная с типом интерфейса, хранит не сами данные, а ссылку на объект в управляемой куче (heap), который этот интерфейс реализует.

Ключевые характеристики интерфейса как типа:

  1. Определяет контракт: Содержит только сигнатуры методов, свойств, событий или индексаторов (до C# 8.0).
  2. Не может быть инстанциирован: Нельзя создать объект напрямую через new IMyInterface().
  3. Позволяет полиморфизм: Объект любого класса, реализующего интерфейс, может быть присвоен переменной этого интерфейсного типа.
  4. Поддержка реализации по умолчанию: Начиная с C# 8.0, интерфейсы могут содержать методы с реализацией по умолчанию (default interface methods).

Почему это ссылочный тип? Это позволяет работать с разнородными объектами через единый контракт, обеспечивая гибкость и слабую связанность в архитектуре.

Пример:

// Интерфейс как ссылочный тип
public interface ILogger
{
    void Log(string message);
    // Метод с реализацией по умолчанию (C# 8.0+)
    void LogError(string error) => Log($"ERROR: {error}");
}

// Класс, реализующий интерфейс
public class FileLogger : ILogger
{
    public void Log(string message)
    {
        File.AppendAllText("log.txt", message + "n");
    }
}

// Использование
ILogger logger = new FileLogger(); // Переменная типа интерфейса хранит ссылку на объект FileLogger
logger.Log("Application started"); // Вызов метода через интерфейс
logger.LogError("File not found"); // Вызов метода по умолчанию