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>
?
Ответы
Ответ 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>