为什么Resharper建议:“返回类型可以是IEnumerable<T>”?

5

我对Resharper还不熟悉,但我很喜欢它。然而,最近它建议我一些东西,这让我感到困惑,我想知道为什么它会给出这个建议。我在Resharper中禁用了它,但我想知道是否有什么我忽略的地方...

我编写了一个签名为:List<string> DoSomething()的函数

Resharper建议我将其更改为:IEnumerable<string> DoSomething()

现在我可以理解为什么方法的参数必须尽可能通用。这可以帮助代码更具可重用性等。然而,我尽量确保我的方法返回的数据是具体而非通用的。

请问有人能解释一下Resharper为什么会提出这样的建议吗?

(要查找规则,请转到Resharper选项\代码检查\检查严重性,并搜索:"返回类型可以是IEnumerable"。)


1
我建议您查看这个答案:https://dev59.com/73TYa4cB1Zd3GeqP0_vs#17904644 - red.clover
谢谢!我尝试在谷歌上搜索“返回类型可以是IEnumerable<T>”,但出于某种原因,那个答案没有显示出来。另一个页面“Resharper建议参数可以是'BaseType'类型”在我的谷歌搜索中确实显示了出来,但那不是我要找的内容。 - Omaer
1个回答

5

有几个原因可能会让你希望拥有更通用的返回类型。

更通用的类型允许您更自由地更改方法的实现,而不改变方法接口。使用返回类型为 IEnumerable<string> ,您可以选择使用 string[] 而不是 List<string> 来生成返回值。

使用更通用的类型可以保护数据。如果方法返回一个作为类中私有成员存在的列表,则调用该方法的人可能会更改返回的列表,而没有意识到它会更改类内部的列表。当您返回一个 IEnumerable<string> 时,只能用于迭代项目,它不会给予更改列表的访问权限。

更受限制的返回类型应如何使用更清晰。假设 IEnumerable<string> 应该被迭代,但是 List<string> 可以用于很多不同的方式。


我同意对于接口,IEnumerable 更有意义(因为不同的实现可能使用 IEnumerable 的不同实现(如列表或数组等))。然而,我的看法是:如果我的类返回一个 List 而不是 IEnumerable,则返回的数据可以与其他接受 List 而不是 IEnumerable 作为参数的方法一起使用。 - Omaer
这是一个“视情况而定”的情况吗?还是将其视为一般规则并修改所有方法以接受IEnumerables而不是Lists更好?我使用列表,因为我觉得性能会更好... - Omaer
@Omaer:Resharper建议您更改类型,因为您实际上只将其用作可枚举对象。您不应该更改所有方法以使用IEnumerable<>,而是应该考虑在哪些情况下它比List<>更合适。传递List<>IEnumerable<>之间根本没有性能差异,唯一的区别是编译器允许您对其执行的操作。 - Guffa
抱歉浪费了您的时间,感谢您的帮助。这是我的意思:void Method2(List<string> data); 接受一个列表,并使用列表方法(如Add等)。现在,需要将从上一个方法返回的列表传递给Method2(需要一个列表)。是将其转换为列表并将该列表传递到Method2更好呢?还是忽略Resharper,直接返回List更合理呢?(我有很多与列表一起工作的方法,还有一些不需要。它们都互相配合工作。) - Omaer
@Omaer:如果您实际上将列表用作列表而不仅仅是迭代它,则将其作为IEnumerable<>传递没有意义。您可以考虑处理列表的另一种方法是将列表封装在类中,并让类的方法与列表一起工作。 - Guffa
这是个好主意 - 我想我会这样做。谢谢 @Guffa! - Omaer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接