Resharper говорит, что я не должен использовать List

#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>