使用返回类型List与IEnumerable的区别

34 浏览
0 Comments

使用返回类型List与IEnumerable的区别

我创建了一个名为foo的函数,它创建并返回一个类型List。ReSharper建议我将返回类型更改为IEnumerable。然而,我知道在调用foo的函数中,有些将要访问List中的随机元素,所以需要先调用IEnumerable.ToList()。我应该将返回类型更改为IEnumerable吗?为什么?

admin 更改状态以发布 2023年5月21日
0
0 Comments

一个返回 List 的方法通常意味着它已经构造并填充了一个新的 List 实例以使调用者受益,调用者随后可以自由地修改该集合,除非调用者提供引用,否则没有其他东西会修改该集合。 返回数组的方法也有类似的期望。 返回集合接口而不是列表或数组类型的方法通常表明它可能会返回一个对象的引用,该对象可能是延迟生成的或与其他代码共享数据。如果调用者需要一个可变集合实例,则应将其接收到的集合提供给像 ToList 这样的方法,并使用后者方法返回的集合。

如果该方法总是为了调用者的利益构造和填充一个新的 List 实例,则应使用指示此情况的返回类型 (即 ListT[])。如果它可能受益于能够返回现有的集合或包装器,则返回其他类型可能更好。请注意,如果调用者需要调用 ToList 如果给定了除 List 之外的其他内容,则即使返回 List 方法会复制列表,但返回其他类型的方法不会使其成为“赢家”。如果任何调用者最终需要调用 ToList,则返回除 List 之外的任何内容都将是一个损失。

有时候,另一种有帮助的方法是:让一个类提供一个方法,该方法接受一个类似于 Action 的参数,并在集合中的每个项上调用它。想要建立包含多个集合中所有项的列表的代码可以构造一个委托来将传入的项附加到列表中,并将该委托传递给每个相关集合,避免每个集合为其项构建新的 List 实例的需要。

0
0 Comments

如果Resharper能够知道某些foo的调用方会想要访问List中的随机元素,它就不会建议你返回IEnumerable。只要你明白所有的情形,你可以选择遵循或不遵循Resharper的建议,尽管这些建议通常很好。

0