Ответ
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 более информативным.