Resharper 说我不应该使用 List
我有一个方法:
static void FileChangesDetected(List<ChangedFiles> files)
我使用了Visual Studio 2010和Resharper。 Resharper 总是建议我将 List
更改为 IEnumerable
,我想知道这是为什么。
在该方法中,我只是这样做:
foreach (var file in files)
{ ... }
使用 IEnumerable
而不是 List
有好处吗?
I have a method:
static void FileChangesDetected(List<ChangedFiles> files)
I used Visual Studio 2010 and Resharper. Resharper always recommends that I change the List<T>
to IEnumerable<T>
, and I'm wondering why this is.
In the method, I simply do this:
foreach (var file in files)
{ ... }
Is there a benefit of using IEnumerable<T>
rather than List<T>
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这一切都与LSP(里氏替换原理)有关。
基本上,最好不要使用实现,而是对抽象进行编码。
在这种特定情况下,如果您所做的只是循环遍历列表,则可以使用
IEnumerable
作为最简单的抽象 - 这样您就不必使用List
,但函数中的任何集合类型。这使您的函数更具可重用性并减少耦合。
It all has to do with LSP (Liskov substitution principle).
Basically, instead of using implementations, it is better to code to abstractions.
In this specific case, if all you do is loop over the list, you can use
IEnumerable<T>
as the simplest abstraction - this way you don't have to use aList<T>
, but any collection type in your function.This allows your functions to be more reusable and reduces coupling.
Resharper 建议您的方法实际上不需要
List
作为参数,并且可以轻松地使用IEnumerable
。这意味着您可以使您的方法更加通用。Resharper suggests that your method doesn't need really require
List<T>
as a parameter and can easily work withIEnumerable<T>
. Which means that you can make you method more generic.如果您只是迭代
文件
,那么它不必是List<>。您的代码也可以使用数组。或者更一般地说:它适用于您可以迭代的任何内容。这由 IEnumerable<> 表示。所以List<>的用法无需任何必要即可限制您消息的使用。 ReSharper 方法只是对此的一个提示。If you are just iterating of your
files
, then it does not have to be a List<>. Your code would also work with an array. Or more general: It will work with anything you can iterate over. That's expressed by IEnumerable<>. So the usage of List<> restricts the usage of you message without any need. The ReSharper method is just a hint for that.因为在您的代码中,您只使用了
files
是IEnumerable
的事实,您不使用 Count 或 Add 等功能。即使稍后您想要使用 List 特定方法(使用 Add 或 Count 方法),最好使用接口:
IList
而不是具体实现。Because in your code, you only use the fact that
files
is anIEnumerable<ChangedFiles>
, you don't use for example Count, nor Add.Even if later on, you want to use List specific methods (with Add or Count methods), it's always better to use an interface:
IList<ChangedFiles>
instead of a concrete implementation.您仍然可以使用 foreach
即使您将其更改为或,
You will still be able to the foreach even if you change it to
or