[英]Using return type List<T> vs IEnumerable<T>
我创建了一个函数foo
,该函数创建并返回List<T>
的类型。 ReSharper建议我将返回类型更改为IEnumberable<T>
。 但是,我知道在调用foo
的函数中,有些将要访问List中的随机元素,因此需要首先调用IEnumerable<T>.ToList()
。 我应该将返回类型更改为IEnumerable<T>
吗? 为什么?
如果Resharper知道某些foo
调用者将要访问List中的随机元素,则不建议您返回IEnumerable<T>
。 只要掌握了所有情况,就应该遵循或不遵循Resharper的建议,尽管这些建议通常非常好。
由于调用foo的函数将执行IEnumerable<T>.ToList()
因此该函数的目的不仅是遍历对象集合,还包括处理对象集合(例如对它进行排序,修改)。一些元素,...) 。 IEnumerable用于仅需要迭代的对象的集合。 因此,您宁可保留列表,而不要将其更改为IEnumerable。 更有用的信息在这里
使用方法返回List<T>
通常意味着它已为调用者的利益构造并填充了一个新的List<T>
实例,然后调用者将可以自由地随意修改该集合,而其他任何都不会修改之后的集合,除非调用方给出了引用。 返回数组的方法具有相似的期望。 使用方法返回集合接口而不是列表或数组类型通常意味着它可能返回对对象的引用,该对象可能是延迟生成的,或者是与其他代码共享的引用数据,并且调用者想要一个可变的收集实例。可以修改的方法也应该将接收到的集合提供给ToList
类的方法,并使用后一种方法返回的集合。
如果该方法总是为了调用者的利益而构造并填充一个新的List<T>
实例,则应使用指示该类型的返回类型(即List<T>
或T[]
)。 如果可以从返回一个现有的集合或一个包装器中受益,则返回某种其他类型可能会更好。 请注意,如果呼叫者需要调用ToList
如果有其他的东西比List<T>
具有方法返回一个List<T>
本身将是一个“赢”,即使它返回的方法List<T>
将不得不作出一个列表的副本,但返回其他类型的方法则不会。 如果一个方法无论返回类型如何都必须构造一个新的集合实例,那么如果任何调用者最终需要调用ToList
,则返回List<T>
以外的任何内容都是一个损失。
有时有用的另一种方法是让类提供一种方法,该方法接受Action<T>
或类似的东西,并在集合中的每个项目上调用它。 想要构建包含多个集合中所有项目的列表的代码可以构造一个委托,以将传入的项目附加到列表中,然后将该委托传递给每个有问题的集合,从而避免了每个集合都需要构建一个其项目的新List<T>
实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.