List<T>
.net 中的定义表明它实现了各种接口。
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
有什么改变接口和没有T
带来什么,IList
即如果我的一个类实现IList<T>
而不是IList
,那么我可以将它用作我的自定义集合类吗?
List<T>
.net 中的定义表明它实现了各种接口。
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
有什么改变接口和没有T
带来什么,IList
即如果我的一个类实现IList<T>
而不是IList
,那么我可以将它用作我的自定义集合类吗?
List<T>
实现这两者IList<T>
的原因IList
是为了让它在你的代码假设的任何地方都可用IList
。这将使过渡到泛型更容易,IList<T>
因为它更合适。此外,如果您有一个 .net 1.1 或更早版本的代码,即使您的类是在 .net 2.0 或更高版本的程序集中实现的,您也想重用它,这将成为可能。
在 aIList<T>
中,您只能放入已定义(T)类型的对象,而 IList 可以包含不同类型的对象
由于 AdressInformation 不是客户列表中的有效对象,因此下面的代码将不符合要求
IList<Customer> customers = new List<Customer>();
customers.Add(new Customer());
customers.Add(new AdressInformation());
此代码将编译但在运行时抛出异常
IList customers = new List<Customer>();
customers.Add(new Customer());
customers.Add(new AdressInformation());
问题:
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
,在尖括号内,extends 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");
执行时,抛出一个强制转换失败异常,然后应用程序停止执行并终止。
如果所有的程序员和开发人员都找不到这个 bug,谁知道哪个客户会发现这个 bug。
这就是为什么命名空间的所有泛型类和接口(包括IList<T>
)都比命名空间System.Collections.Generic
的所有类和接口(包括 )要好得多,IList
并且System.Collections
通常应该System.Collections.Generic
是推荐的命名空间。
从历史上看,命名空间System.Collections
和在这个命名空间中定义的所有类和接口,包括 interface IList
,都存在于命名空间System.Collections.Generic
和它的所有类和接口(包括IList<T>
通用接口)之前。
命名空间System.Collections.Generic
及其所有类和接口是在 Microsoft 的 .NET Framework 的更高版本中引入的。