我知道IList是接口,List是具体类型,但我仍然不知道何时使用每一个。我现在做的是,如果我不需要Sort或FindAll方法,我使用接口。我说的对吗?是否有更好的方法来决定何时使用接口或具体类型?
当前回答
有一件重要的事情,人们似乎总是忽视:
你可以将一个普通数组传递给接受IList<T>参数的对象,然后你可以调用IList. add(),并将收到一个运行时异常:
未处理异常:系统。NotSupportedException:集合大小固定。
例如,考虑以下代码:
private void test(IList<int> list)
{
list.Add(1);
}
如果你像下面这样调用它,你会得到一个运行时异常:
int[] array = new int[0];
test(array);
这是因为使用带有IList<T>的普通数组违反了利斯科夫替换原则。
因此,如果你调用IList<T>. add(),你可能需要考虑使用List<T>而不是IList<T>。
其他回答
你应该只在你需要它的时候使用这个接口,例如,如果你的列表被强制转换为一个IList实现而不是list。这是真的,例如,当你使用NHibernate,它在检索数据时将列表转换为NHibernate包对象。
如果List是您将用于某个集合的唯一实现,则可以将其声明为具体的List实现。
使用最低基类型总是最好的。这使接口的实现者或方法的使用者有机会在幕后使用他们喜欢的任何东西。
对于集合,应该尽可能使用IEnumerable。这提供了最大的灵活性,但并不总是适合。
If you're working within a single method (or even in a single class or assembly in some cases) and no one outside is going to see what you're doing, use the fullness of a List. But if you're interacting with outside code, like when you're returning a list from a method, then you only want to declare the interface without necessarily tying yourself to a specific implementation, especially if you have no control over who compiles against your code afterward. If you started with a concrete type and you decided to change to another one, even if it uses the same interface, you're going to break someone else's code unless you started off with an interface or abstract base type.
一个List对象允许你创建一个列表,添加东西到它,删除它,更新它,索引到它等等。当你只想要一个泛型列表时,List就会被使用,你可以在其中指定对象类型。
另一方面,IList是一个接口。基本上,如果您想创建自己的自定义列表,比如一个名为BookList的列表类,那么您可以使用接口为您的新类提供基本方法和结构。IList用于当你想创建自己的特殊子类来实现List时。
另一个区别是: IList是一个接口,不能被实例化。List是一个类,可以实例化。它的意思是:
IList<string> list1 = new IList<string>(); // this is wrong, and won't compile
IList<string> list2 = new List<string>(); // this will compile
List<string> list3 = new List<string>(); // this will compile
我同意李的建议,接受一些参数,但不要回头。
如果你指定你的方法来返回一个接口,这意味着你以后可以自由地更改确切的实现,而消费方法永远不会知道。我认为我永远不需要从List<T>更改,但后来不得不更改为使用自定义列表库,以获得它提供的额外功能。因为我只返回了一个IList<T>,所以使用这个库的人都不需要改变他们的代码。
当然,这只需要应用于外部可见的方法(即公共方法)。我个人甚至在内部代码中使用接口,但如果你做了破坏性的更改,你可以自己更改所有的代码,这并不是严格必要的。
推荐文章
- 何时使用IList,何时使用List
- ConfigurationManager。AppSettings在.NET Core 2.0中可用?
- 在c#的控制台应用程序中使用'async
- 在单元测试中设置HttpContext.Current.Session
- 如何开始开发Internet Explorer扩展?
- 更新行,如果它存在,否则插入逻辑实体框架
- 在什么情况下SqlConnection会自动被征召到环境事务范围事务中?
- 用c#解析JSON
- Windows窗体中的标签的换行
- 为什么在c#中使用finally ?
- 为什么不是字符串。空一个常数?
- 为什么我不能在c#中有抽象静态方法?
- Nuget连接尝试失败“无法为源加载服务索引”
- net HttpClient。如何POST字符串值?
- 我如何使一个方法的返回类型泛型?