Что такое IReadOnlyList в C#?

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

Ответ

IReadOnlyList — это интерфейс, представляющий контракт на доступ только для чтения к коллекции с поддержкой индексатора. Он гарантирует, что потребитель не сможет изменить саму коллекцию (добавить/удалить элементы), но не защищает от изменения состояния самих объектов внутри коллекции.

Иерархия: IEnumerable<T> -> IReadOnlyCollection<T> -> IReadOnlyList<T>.

Пример использования:

// Метод возвращает защищенную от изменений коллекцию
public IReadOnlyList<string> GetActiveUsers()
{
    List<string> internalList = FetchUsersFromDatabase();
    // Возвращаем как IReadOnlyList, скрывая методы модификации
    return internalList;
}

// Клиентский код
var users = GetActiveUsers();
Console.WriteLine(users[0]); // Доступ по индексу работает
Console.WriteLine(users.Count); // Получение количества работает
// users.Add("NewUser"); // Ошибка компиляции: IReadOnlyList не содержит метода Add

Ключевые моменты:

  • Защита инкапсуляции: Это предпочтительный тип возвращаемого значения для методов, которые должны предоставлять данные, но не позволять их модифицировать. Это делает API более безопасным и предсказуемым.
  • Не гарантирует неизменяемость объектов: Если T — ссылочный тип, его поля могут быть изменены. Для полной иммутабельности нужны неизменяемые типы (record, readonly struct).
  • Производительность: Многие стандартные коллекции (List<T>, Array, T[]) реализуют этот интерфейс, поэтому преобразование происходит без накладных расходов на копирование.
  • Альтернатива IEnumerable: В отличие от IEnumerable<T>, IReadOnlyList<T> явно сообщает о возможности доступа по индексу и о наличии свойства Count, что делает контракт API более информативным.