问题:
IList 和 IList<T> 有什么区别?
答案:
IList 和 IList<T> 都是接口,但 IList 不是通用的,它既属于并属于 System.Collections 命名空间,而 IList<T> 是通用的,它既属于又属于System.Collections.Generic 命名空间。
此外,System.Collections.IList 也与 System.Collections.Generic.IList<object> 相同。
由于object,在C#中,可以是任何可以在泛型类型T中使用的类型,在尖括号内,扩展object,这意味着System.Collections.IList和System.Collections.Generic.IList<T>有相同的表现力。
这也说明了所有可以在System.Collections.IList接口的帮助下完成的任务,这些任务也可以在System.Collections.Generic.IList<T>接口的帮助下完成。
如果是这样,那么更喜欢什么:System.Collections.IList 或 System.Collections.Generic.IList<T>?
虽然System.Collections.IList 更短并且需要更少的输入,但System.Collections.Generic.IList<T> 仍然更好,更值得推荐,因为它使您的代码更加精确、准确、准确、正确、严格、信息丰富、解释性、详细、详尽,逐项,详细,表达,清晰,可读和易读,如果程序员在使用通用接口时犯了任何错误,那么编译可能会失败,程序员会立即知道并理解他/她做错了什么,纠正错误和客户可能会在应用程序中遇到更少的错误。
但是不正确地使用非通用接口可能会在应用程序中产生未知的错误,客户可能会发现这些错误,使他/她不满意,向开发人员报告这些错误,还可能要求/要求/启动一个退款。
举个例子:
System.Collections.Generic.IList<int> list = GetSomeListOfIntegers();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add("four");
list.Add(5);
上面的代码因为list.Add("four");这一行无法编译。
该错误或多或少表明参数必须是int,但它是string。
这有助于在构建应用程序之前查看编译器错误并纠正所有错误。这样,客户就不会在应用程序中遇到不必要的错误并保持满意。
但是如果程序员不更改list.Add("four");这一行,那会导致编译器失败,而是将System.Collections.Generic.IList<int>替换为System.Collections.IList并修改方法GetSomeListOfIntegers以返回System.Collections.IList的实例而不是System.Collections.Generic.IList<int> 的一个实例
那么代码就编译成功了,但是在执行list.Add("four");的时候,抛出了cast failure异常,然后应用程序停止执行并终止。
如果所有程序员和开发人员都找不到这个 bug,谁知道哪个客户会发现这个 bug。
这就是为什么命名空间System.Collections.Generic的所有泛型类和接口,包括IList<T>,都比命名空间System.Collections和@987654357的所有类和接口,包括IList好得多@ 应该是推荐的命名空间一般而言。
从历史上看,命名空间System.Collections 以及在此命名空间中定义的所有类和接口,包括接口IList,都存在于命名空间System.Collections.Generic 及其所有类和接口(包括IList<T> 泛型接口)之前。
命名空间System.Collections.Generic 及其所有类和接口是在 Microsoft 的 .NET Framework 的更高版本中引入的。