我听说在调用方法时,尽量使用最低级别的类来传递参数非常重要。为什么呢?另外,我应该在哪里找到更多关于类层次结构的信息呢?我想知道 IEnumerable 继承自哪个类等等。
我听说在调用方法时,尽量使用最低级别的类来传递参数非常重要。为什么呢?另外,我应该在哪里找到更多关于类层次结构的信息呢?我想知道 IEnumerable 继承自哪个类等等。
IEnumerable<T>
作为参数类型,那么您可以传递任何实现该接口的类型。这包括List<T>
,Stack<T>
,Queue<T>
等。
它还包括可能是LINQ查询结果的各种匿名类型,以及非常重要的IQueryable<T>
。
Enumerable是只读序列,而List可以附加。
如果你设计公共API以便在各个地方都使用IList<T>,然后意识到你需要返回只读列表,那么你必须通过改用IEnumerable<T>来更改代码或使用可怕的ReadOnlyCollection。我称它为可怕的是因为它会在.Add/.Remove等操作上抛出异常。
因此,如果你只需要读取,则返回IEnumerable,如果你的调用者需要添加/附加,则返回IList。
另外:永远不要返回List<T>,始终返回IList<T>。原因是List是一个具体的类,不能以任何明智的方式被覆盖,而IList是一个接口,允许你更改实际的实现而不破坏公共契约。
我能想到的最快的方法是:如果您不再希望您的实现是 List<T>
类型,会发生什么?
假设有一天您决定重构应用程序以使用 LinkedList<T>
或 SortedList<T>
,那么您只需要更改该类型,而不是可能将您的集合传递给所有方法中的所有类型。
通过使用这种技术,您可以提高代码的可维护性。
这个想法是最大化函数的灵活性。如果您需要一个List<T>,那么调用者必须有一个可传递的列表。如果他们没有一个方便的列表,他们将不得不创建一个,这是昂贵的。另一方面,如果您需要IEnumerable<T>,则他们可以传递任何集合。
在.NET中查找类层次结构信息的最佳位置是MSDN。