Resharper建议我不要使用List<T>。

26

我有一个方法:

static void FileChangesDetected(List<ChangedFiles> files)

我使用的是Visual Studio 2010和Resharper。Resharper总是建议我将List<T>更改为IEnumerable<T>,我想知道这是为什么。

在方法中,我只是这样做:

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

使用 IEnumerable<T>相比于List<T>有什么好处吗?

5个回答

29

这一切都与LSP(里氏替换原则)有关。

基本上,与其使用实现,不如编写抽象代码。

在这种特定情况下,如果你只是循环遍历列表,你可以使用IEnumerable<T>作为最简单的抽象 - 这样你不必使用List<T>,而是可以在函数中使用任何集合类型。

这使得你的函数更具可重用性并减少了耦合


IEnumerable比ICollection更简单。 - Achim
IEnumerable,而不是ICollection。 - Peter Lillevold
谢谢。是因为使用IEnumerable/ICollection会使用更少的系统资源,或者比使用List<>更有效率吗?因为List<>提供了更多的方法,但我并没有使用到它们? - Craig
3
与资源无关,而与软件设计有关。更好的是_设计_. - Oded
例如,假设我已经有一个(老式的或者设计不太好的)库方法,它返回一个数组...虽然它是IEnumerable,但它不是List...所以我可以将它传递给你有用的FastForward(IEnumerable<Time>)方法,而无需先将其转换为List。 - corlettk
抱歉挑剔,但是Liskov原则并没有规定您应该或必须在可能的情况下替换超类型,它只是说应该始终可以。在Liskov中没有“使用抽象化更好”的建议概念。不过,如果您的代码遵循Liskov原则,那么您可以安全地应用这个R#建议。 - Simon Mourier

3

Resharper建议您的方法并不真正需要List<T>作为参数,而是可以轻松使用IEnumerable<T>。这意味着您可以使您的方法更加通用。


3

如果你只是迭代你的files,那么它不一定要是一个List<>。你的代码也可以使用数组。或者更一般地说:它将适用于任何你可以迭代的东西。这由IEnumerable<>表示。因此,使用List<>限制了你的消息使用而没有必要。ReSharper方法只是一个提示。


2
因为在您的代码中,您仅使用了files是一个IEnumerable<ChangedFiles>的事实,您没有使用例如Count或Add等方法。
即使以后您想要使用List特定的方法(使用Add或Count方法),始终最好使用接口:IList<ChangedFiles>而不是具体的实现。

1

即使您将其更改为其他方式,仍然可以使用foreach。

IEnumerable<ChangedFiles>

或者

ICollection<ChangedFiles>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接