我听说在将参数传递给方法时使用最低级别很重要。为什么是这样?另外,我在哪里可以找到有关类层次结构的更多信息?我想知道IEnumerable继承了什么,等等。
答案 0 :(得分:4)
如果使用IEnumerable<T>
作为参数类型,则可以传入实现该接口的任何类型。其中包括List<T>
,Stack<T>
,Queue<T>
等
它还包括可能是LINQ查询结果的各种匿名类型,以及非常重要的IQueryable<T>
。
答案 1 :(得分:3)
通过使用“低级”参数,您可以使方法能够处理更多种类的对象。它鼓励编写通用的可重用方法。
MSDN可以告诉你什么不同的东西继承(在IEnumerable的情况下,它从什么都没有继承,因为它几乎代表了“列表”的最原始的想法)
答案 2 :(得分:2)
IEnumerable是一个只读序列,而List可以附加到。
如果您设计公共API,以便在所有地方公开IList<T>
,然后意识到您想要返回只读列表,则必须通过更改为IEnumerable<T>
来中断代码或使用可怕的ReadOnlyCollection。我称之为可怕,因为它会在.Add / .Remove等上抛出异常。
因此,如果您只需要阅读,则返回IEnumerable,如果您的调用者需要添加/追加,则返回IList。
另一方面:永远不要返回List<T>
,始终为IList<T>
。原因是List是一个不能以任何明智的方式覆盖的具体类,而IList是一个允许您在不违反公共合同的情况下更改实际实现的接口。
答案 3 :(得分:1)
我能想到的最快的事情是:如果您不再希望您的实现属于List<T>
类型,会发生什么?
假设您有一天决定重构您的应用程序以使用LinkedList<T>
或SortedList<T>
,您需要更改的是该类型而不是所有方法中的所有类型将你的收藏品传递给。
您可以使用此技术来提高代码的可维护性。
答案 4 :(得分:1)
这个想法是最大化你的功能的灵活性。如果你需要List&lt; T&gt;,那么调用者必须有一个传入。如果他们没有一个方便,他们将不得不创建一个,这是昂贵的。另一方面,如果你需要IEnumerable&lt; T&gt;,那么他们可以传入任何集合。
获取.NET中heiarchy类信息的最佳位置是MSDN。