Решарпер говорит, что я не должен использовать Список <T> - PullRequest
26 голосов
/ 28 мая 2011

У меня есть метод:

static void FileChangesDetected(List<ChangedFiles> files)

Я использовал Visual Studio 2010 и Resharper.Решарпер всегда рекомендует мне изменить List<T> на IEnumerable<T>, и мне интересно, почему это так.

В методе я просто делаю это:

 foreach (var file in files)
 { ... }

Есть липреимущество использования IEnumerable<T> вместо List<T>?

Ответы [ 5 ]

29 голосов
/ 28 мая 2011

Все это связано с LSP (принцип подстановки Лискова).

По сути, вместо использования реализаций лучше кодировать абстракции.

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

Это позволяет вашим функциям быть более многократно используемыми и уменьшает сцепление .

3 голосов
/ 28 мая 2011

Если вы просто перебираете свой files, то это не обязательно должен быть список <>. Ваш код также будет работать с массивом. Или более общий: он будет работать со всем, что вы можете повторить. Это выражается IEnumerable <>. Таким образом, использование List <> ограничивает использование вашего сообщения без какой-либо необходимости. Метод ReSharper - просто подсказка для этого.

3 голосов
/ 28 мая 2011

Решарпер предполагает, что вашему методу не требуется действительно List<T> в качестве параметра, и он может легко работать с IEnumerable<T>. Это означает, что вы можете сделать свой метод более универсальным.

2 голосов
/ 28 мая 2011

Поскольку в вашем коде вы используете только тот факт, что files является IEnumerable<ChangedFiles>, вы не используете, например, Count или Add.

Даже если позже вы захотите использовать методы, специфичные для List (с методами Add или Count), всегда лучше использовать интерфейс: IList<ChangedFiles> вместо конкретной реализации.

1 голос
/ 28 мая 2011

Вы по-прежнему сможете использовать foreach, даже если вы измените его на

IEnumerable<ChangedFiles>

или

ICollection<ChangedFiles>
...