Обычно лучше всего использовать наименее мощный интерфейс, с которым пользователь все еще может работать. Если пользователю просто нужны перечисляемые данные, верните IEnumerable<User>
. Если этого недостаточно, потому что пользователь должен иметь возможность изменять список (внимание! Это не всегда так), вернуть IList<User>
.
/ EDIT:
Джоэл задает действительный вопрос в своем комментарии: почему действительно предоставляется наименее мощный интерфейс вместо предоставления пользователю максимальной мощности? (Перефразировал)
Идея заключается в том, что метод, возвращающий данные, может не ожидать, что пользователь изменит его содержимое: другой метод класса может все еще ожидать, что список будет непустым после возврата ссылки на него. Представьте, что пользователь удаляет все данные из списка. Другой метод теперь должен сделать дополнительную проверку, что ele, возможно, был ненужен.
Что еще более важно, это раскрывает части внутренней реализации через тип возвращаемого значения. Если мне нужно изменить реализацию в будущем, чтобы она больше не использовала контейнер IList
, у меня возникает проблема: мне нужно либо изменить контракт метода, введя изменение, нарушающее сборку. Или мне нужно скопировать данные в контейнер списка.
В качестве примера представьте, что эффективная реализация использует словарь и просто возвращает коллекцию Values
, которая не реализует IList
.