有人能向我解释一下为什么我想在c#中使用IList而不是List吗?
相关问题:为什么公开List<T>被认为是不好的
有人能向我解释一下为什么我想在c#中使用IList而不是List吗?
相关问题:为什么公开List<T>被认为是不好的
当前回答
接口是一种承诺(或契约)。
承诺总是这样,越小越好。
其他回答
通常,一个好的方法是在面向公共的API中使用IList(在适当的情况下,并且需要列表语义),然后在内部使用list来实现API。这允许您在不破坏使用您的类的代码的情况下更改到不同的IList实现。
类名List可能在下一个。net框架中改变,但接口永远不会改变,因为接口是契约。
注意,如果你的API只会在foreach循环中使用,那么你可能会考虑只暴露IEnumerable。
使用接口而不是实现的最重要情况是API的参数。如果API接受List参数,那么使用它的任何人都必须使用List。如果参数类型是IList,那么调用者有更多的自由,并且可以使用您从未听说过的类,这些类在编写代码时甚至可能不存在。
所有的概念基本上都在上面关于为什么使用接口而不是具体实现的回答中说明了。
IList<T> defines those methods (not including extension methods)
IList<T> MSDN link
添加 清晰的 包含 CopyTo GetEnumerator IndexOf 插入 删除 RemoveAt
List<T>实现了这9个方法(不包括扩展方法),除此之外,它还有大约41个公共方法,这将影响您在应用程序中使用哪个方法。
List<T> MSDN link
如果您通过其他人将使用的库来公开类,则通常希望通过接口而不是具体实现来公开类。如果您决定稍后更改类的实现以使用不同的具体类,这将有所帮助。在这种情况下,库的用户不需要更新他们的代码,因为接口没有改变。
如果您只是在内部使用它,您可能不会太在意,使用List<T>可能就可以了。
IList<T>是一个接口,所以你可以继承另一个类,仍然实现IList<T>,而继承List<T>阻止你这样做。
例如,如果有一个类a,你的类B继承了它,那么你不能使用List<T>
class A : B, IList<T> { ... }