Подтвердить что ты не робот

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

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

static void FileChangesDetected(List<ChangedFiles> files)

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

IEnumerable<ChangedFiles>

или

ICollection<ChangedFiles>