我创建了一个函数foo
,它创建并返回List<T>
类型。 ReSharper建议我将返回类型更改为IEnumberable<T>
。但是,我知道在调用foo
的函数中有些人想要访问List中的随机元素,因此需要先调用IEnumerable<T>.ToList()
。我应该将退货类型更改为IEnumerable<T>
吗?为什么呢?
答案 0 :(得分:2)
如果Resharper知道某些foo
个来电者想要访问列表中的随机元素,则不会建议您返回IEnumerable<T>
。只要你有所有图片,你应该遵循或不遵循Resharper的建议,但这些建议往往非常好。
答案 1 :(得分:0)
由于调用foo的函数会执行IEnumerable<T>.ToList()
,因此很可能该函数的目的不仅是迭代对象集合而且还要处理它(例如对它进行排序) ,修改一些元素,......)。 IEnumerable用于只需要迭代的对象集合。因此,您应该保留List而不是将其更改为IEnumerable。更有用的信息here
答案 2 :(得分:0)
方法返回List<T>
通常意味着它已构造并填充新的List<T>
实例以使调用者受益,然后调用者可以根据需要自由修改该集合,除非给出来电者的参考,否则在此之后别的任何东西都不会修改集合。返回数组的方法有类似的期望。让一个方法返回一个集合接口而不是一个列表或数组类型通常表明它可能会返回一个对象的引用,该对象可能是懒惰生成的,也可能是与其他代码共享的引用数据,以及一个想要一个可变集合实例的调用者也可以修改它应该将它收到的集合提供给像ToList
这样的方法,并使用后一种方法返回的集合。
如果方法始终构造并填充新的List<T>
实例以使调用者受益,则应使用指示该实例的返回类型(即List<T>
或T[]
)。如果能够返回现有集合或包装器周围的包装器可能会受益,那么返回其他类型可能会更好。请注意,如果调用者需要在ToList
以外的其他内容时调用List<T>
,那么让该方法返回List<T>
本身就是&#34; win&#34;即使返回List<T>
的方法必须复制列表,但返回其他类型的方法也不会。如果一个方法必须构建一个新的集合实例而不管返回类型如何,如果任何调用者最终需要调用List<T>
,那么返回ToList
以外的任何内容将是一个损失。
有时候有用的另一种方法是让一个类提供一个接受Action<T>
或类似东西的方法,并在集合中的每个项目上调用它。想要构建包含来自多个集合中的所有项的列表的代码然后可以构造委托以将传入的项附加到列表并将该委托传递给所讨论的每个集合,从而避免需要使每个集合构建一个其项目的新List<T>
实例。