将List<int>分配给IEnumerable<int>是否有益?

3

我使用的语言是C#。

假设一个对象的方法返回一个List<int>。如果我们将这个结果赋值给一个类型为IEnumerable<int>的变量,我们是否会获得任何好处呢?

换句话说:

IEnumerable<int> result = list

优于

List<int> result = list

其中listList<int>

我认为直观上我们不会从中获益。但是,我想要确定。因此我在询问这个问题。


2
List具有IEnumerable所没有的功能。如果您需要这个功能,请返回List。否则,请返回IEnumerable,以便将来进行任何更改时,不会出现重构的连锁反应。 - bland
是的,但请返回IList<T>而不是List<T>。 - fsimonazzi
@bland,所以我唯一的好处就只有在重构现有代码时能够更清晰易懂。就优化而言,如果我没理解错的话,我不会得到任何好处,对吗? - Christos
1
正确的,这种情况下没有优化。 - bland
3个回答

1
缺点就是你不能使用List<T>特定的方法。 优点是,你可以在返回列表的方法中更改实现成另一种类型的列表(或集合等),因为你所需的只是IEnumerable<T>
折衷方案是使用 IList<T> 如果你需要像 Add 这样的方法。
并且,从一个方法返回 List<T> 不是一个好主意。如果你是该方法的实现者,则至少应该返回 IList<T> ,甚至可能是 IEnumerable<T>
通常情况下,有时候你不得不强制转换成基础类型,参见 new keyword in method signature

不,我不想要任何像Add这样的方法。在我的情况下,我唯一想要的是使用foreach语句遍历列表中的所有元素。 - Christos
@ChristosPaisios 那么我认为你完全可以使用 IEnumerable<T>。另一个选项是使用 var,但只有在方法返回类型明确的情况下才这样做。 - Lasse Espeholt

0
唯一的原因是这样做,是为了以这种方式将列表返回给调用者,使得调用者无法修改该列表*。

*除非调用者对列表执行硬转换

话虽如此 - 使用最不具体的类/接口总是有益的 - 因为它为代码重用开辟了更多可能性。


0
在这种特定情况下,没有理由将本地变量类型定义为接口。如果对象显式实现了某个接口,则可能需要这样做,但对于List和IEnumerable来说并非如此。它显式实现了IEnumerable。
如果您认为您可能希望将其他类型的IEnumerable而不是List设置为结果,则可以这样做,但通常情况下,除非您实际处于该情况,否则我不会费心去进行此类更改,而不是试图预先执行此操作。作为局部变量,而不是类型公共API的一部分,您始终可以在将来的修订中更改变量类型,而不会产生任何真正重大的后果。

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