为什么我应该选择返回 `IList` 而不是 `List`?

32 浏览
0 Comments

为什么我应该选择返回 `IList` 而不是 `List`?

在SO上,人们经常说你应该从你的方法中返回`IList`而不是`List`,但我找不到任何真正好的理由。我一直在找到这样的代码,然后调用代码通常会做以下两件事之一:\n

    \n

  1. 调用`new List(returnedIList)`,以便可以使用`List`上的所有好用的方法
  2. \n

  3. 将其强制转换回`List`,以便可以使用`List`上的所有好用的方法
  4. \n

\n第一个方法很笨重,第二个方法如果实现实际上更改为其他类型的话,会抛出(运行时)`InvalidCastException`(这是完全愚蠢的)。\n如果我使用`List`,然后由于某种原因不得不将其替换为无法继承自`List`的`IList`的实现,那么我将会遇到构建错误并且必须更改一些代码。这可能非常不太可能发生,如果发生了,修复起来也不会花费太多时间。肯定不值得为了这种不太可能的情况而失去`List`的好处和/或不得不强制转换/新建`List`(Exists、Find等)来恢复它们,对吧?\n那么,是否还有其他原因需要返回`IList`呢?

0
0 Comments

为什么我应该返回IList而不是List

在开发代码时,我们常常需要返回一个列表对象。通常情况下,我们会使用List作为返回类型。然而,有些开发者建议使用IList作为返回类型,而不是具体的List

为什么要这样做呢?原因在于,使用IList作为返回类型可以增加代码的灵活性。我们可能会在将来需要使用除了List之外的其他列表类型。如果我们使用IList而不是具体的List,那么当我们需要更改列表类型时,我们只需要更改实现IList接口的自定义列表类,而不需要修改大部分代码。

在.NET框架中,有很多派生于IList的类型。这意味着,如果我们使用IList作为返回类型,我们可以使用更多不同的列表类型,而不仅仅局限于List

当然,也有人提出了一些不同的观点。有人认为,如果可能的话,应该返回IEnumerable而不是IList。因为IEnumerable是一个更为通用的接口,可以适用于更多的情况。此外,IEnumerable可以通过yield关键字来实现,从而避免了创建新的列表对象的开销。

然而,无论是返回IEnumerable还是IList,都有其适用的场景。对于一些特定的需求,IEnumerable可能无法满足要求,此时使用IList可能更合适。而对于一些可以使用列表的情况,IEnumerable也是一个不错的选择。

总之,使用IList作为返回类型可以增加代码的灵活性,使得我们可以在将来更容易地切换到其他列表类型。尽管在某些情况下,返回IEnumerable或List可能更合适,但使用IList作为返回类型是一个值得考虑的选择。

0
0 Comments

为什么我应该返回IList而不是List

原因是你的方法可以与实现了IList接口的任何对象一起使用,而不仅仅是List。随着Linq的出现,情况变得更糟了,我开始让很多东西返回Enumerable甚至只返回IEnumerable!

不过,我不确定我是否理解了困难所在。如果某个方法返回的是一个实际的列表,并且其返回值取决于该列表,或者其使用方式特定于该列表,那么它应该返回List。如果不是这样,那么你就没有必要将其转换为List。

我怀疑调用代码是在方法编写之后编写的,程序员不愿意更改方法以返回一个具体的List - 我正在努力理解这个决定是否合理。

解决方法:根据实际需求,如果方法的返回值依赖于具体的列表类型或者方法的使用方式特定于某个列表类型,则应该返回List。如果方法的返回值不依赖于具体的列表类型,或者可以适用于任何实现了IList接口的对象,则应该返回IList。根据具体情况进行判断,选择合适的返回类型。

0
0 Comments

为什么我应该返回IList而不是List

在上述内容中,提到了以下几个原因:

1. 通过返回IList而不是List,可以使代码更加灵活。可以替换实现了IList接口的任何集合,而不会破坏任何调用代码。这是一件好事...但前提是IList中定义的功能能够满足你的需求。

2. 应该始终返回最通用的类型。在大多数情况下,可以使用IEnumerable,但如果需要更多的功能,则可以使用IList。如果这些都不满足需求,可以返回具体的类型。

3. 在两种情况下,需要使用IList中没有直接提供的功能。在这种情况下,要么方法应该返回List以提供所需的功能,要么调用者应该使用另一个方法。

根据上述内容,可以得出以下解决方法:

1. 在设计代码时,应该考虑到未来可能需要替换实现的情况。因此,应尽量返回最通用的类型,如IList,以确保代码的灵活性。

2. 如果需要更多的功能,可以考虑返回具体的类型,如List。但在这种情况下,需要确保调用者了解并适当使用该类型。

3. 如果需要使用IList中没有直接提供的功能,可以选择返回List以满足需求。或者,也可以通过使用其他方法来解决问题。

为了提高代码的灵活性和可扩展性,应该尽量返回最通用的类型,如IList。但在某些情况下,可能需要返回具体的类型或使用其他方法来满足特定需求。

0