Должен ли я вернуть тип IEnumerable или список? - PullRequest
1 голос
/ 17 марта 2020

Я определил функцию: public IEnumerable<User> GetAllUsers()

Лог c этой функции выглядит примерно так:

var userList = new List<User>
.. logic ...
return userList;

Есть ли преимущество определенного возвращаемого типа IEnumerable<User> или я должен просто сказать об этом и определить тип возврата List<User>?

Ответы [ 3 ]

2 голосов
/ 17 марта 2020

Это будет зависеть. Всегда лучше возвращать максимально возможный тип ограничения, но проблема с IEnumerable заключается в том, что он, как правило, не предназначен для перечисления более одного раза. Например, IEnumerable может выбирать из базы данных, и каждое перечисление запускает потенциально длительный запрос.

В вашем случае, если вы хотите вернуть информацию о пользователе, я бы рассмотрел IReadOnlyList или IReadOnlyCollection

0 голосов
/ 17 марта 2020

Как указано в Руководстве по коллекциям :

НЕ используйте ReadOnlyCollection<T>, подкласс ReadOnlyCollection<T> или в редких случаях IEnumerable<T> для свойств или возвращаемых значений, представляющих Коллекции только для чтения.

В общем, предпочитают ReadOnlyCollection<T>. Если он не удовлетворяет некоторым требованиям (например, коллекция не должна реализовывать IList), используйте пользовательскую коллекцию, реализовав IEnumerable<T>, ICollection<T> или IList<T>. Если вы реализуете пользовательскую коллекцию только для чтения, реализуйте ICollection<T>.IsReadOnly для возврата true.

В тех случаях, когда вы уверены, что единственный сценарий, который вы когда-либо захотите поддержать, - это итерация только вперед, Вы можете просто использовать IEnumerable<T>.

и НЕ использовать ArrayList или List в publi c API :

Эти типы - это структуры данных, предназначенные для использования во внутренней реализации, а не в API publi c. Список оптимизирован для производительности и мощности за счет чистоты API и гибкости. Например, если вы вернете список, вы никогда не сможете получать уведомления, когда код клиента изменяет коллекцию. Кроме того, List предоставляет множество членов, таких как BinarySearch, которые бесполезны или неприменимы во многих сценариях ios. В следующих двух разделах описаны типы (абстракции), специально разработанные для использования в API publi c.

0 голосов
/ 17 марта 2020

Каждая коллекция может быть неявно преобразована в IEnumerable. Действительно, это случается каждый раз, когда вы кормите одного на foreach-l oop. foreach only работает с Enumerables. К досаде всех, кто сталкивается с этим исключением: Невозможно удалить элемент списка из списка внутри a для каждого l oop C#

Поскольку вы, вероятно, конечны sh Заполняя список перед возвращением, я не вижу никаких преимуществ для Enumerables. В чем они действительно хороши, так это в сокрытии асинхронного извлечения данных от потребителей. Восстановление, которое происходит , пока Enumerable используется. См. Directory.EnumerateFiles () для практического примера.

List<T> является более универсальным. Если кому-то нужен IEnumerable<T>, он может сделать его без соответствующего объема работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...