#c# #list #resharper #ienumerable
#c# #Список #resharper #ienumerable
Вопрос:
У меня есть метод:
static void FileChangesDetected(List<ChangedFiles> files)
Я использовал Visual Studio 2010 и Resharper. Resharper всегда рекомендует мне изменить List<T>
на IEnumerable<T>
, и мне интересно, почему это так.
В методе я просто делаю это:
foreach (var file in files)
{ ... }
Есть ли преимущество в использовании IEnumerable<T>
вместо List<T>
?
Ответ №1:
Все это связано с LSP (принципом подстановки Лискова).
В принципе, вместо использования реализаций лучше кодировать абстракции.
В этом конкретном случае, если все, что вы делаете, это перебираете список, вы можете использовать IEnumerable<T>
как простейшую абстракцию — таким образом, вам не придется использовать List<T>
, а любой тип коллекции в вашей функции.
Это позволяет вашим функциям быть более повторно используемыми и уменьшает сцепление.
Комментарии:
1. IEnumerable проще, чем ICollection
2. IEnumerable, а не ICollection.
3. Спасибо. Это потому, что использование IEnumerable / ICollection использует меньше системных ресурсов или более эффективно, чем использование List<> , потому что List<> предоставляет больше методов, которые я не использую?
4. @cdotlister — Это не имеет ничего общего с ресурсами, но с дизайном программного обеспечения. Это лучший дизайн .
5. @cdolister — Например, скажем, у меня уже есть библиотечный метод (старой школы или просто не очень хорошо разработанный), который возвращает массив … который является IEnumerable, но НЕ является списком… таким образом, я мог бы передать ему ваш полезный
FastForward(IEnumerable<Time>)
метод, без необходимости сначала преобразовывать его в список.
Ответ №2:
Resharper предполагает, что вашему методу действительно не нужен require List<T>
в качестве параметра и с ним можно легко работать IEnumerable<T>
. Это означает, что вы можете сделать свой метод более универсальным.
Ответ №3:
Если вы просто повторяете свой files
, то это не обязательно должен быть список<> . Ваш код также будет работать с массивом. Или более общий: он будет работать со всем, что вы можете повторить. Это выражается с помощью IEnumerable<> . Таким образом, использование List<> ограничивает использование вашего сообщения без какой-либо необходимости. Метод ReSharper — это просто подсказка для этого.
Ответ №4:
Поскольку в вашем коде вы используете только тот факт, что files
является IEnumerable<ChangedFiles>
, вы не используете, например, Count или Add.
Даже если позже вы захотите использовать методы, специфичные для списка (с методами Add или Count), всегда лучше использовать интерфейс: IList<ChangedFiles>
вместо конкретной реализации.
Ответ №5:
Вы все равно сможете использовать foreach, даже если измените его на
IEnumerable<ChangedFiles>
или
ICollection<ChangedFiles>