5

List<T>.net 中的定义表明它实现了各种接口。

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

有什么改变接口和没有T带来什么,IList即如果我的一个类实现IList<T>而不是IList,那么我可以将它用作我的自定义集合类吗?

4

3 回答 3

13

List<T>实现这两者IList<T>的原因IList是为了让它在你的代码假设的任何地方都可用IList。这将使过渡到泛型更容易,IList<T>因为它更合适。此外,如果您有一个 .net 1.1 或更早版本的代码,即使您的类是在 .net 2.0 或更高版本的程序集中实现的,您也想重用它,这将成为可能。

于 2012-12-22T12:14:28.487 回答
6

在 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());
于 2012-12-22T12:08:00.447 回答
0

问题:

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.IListSystem.Collections.Generic.IList<T>具有相同的表达能力。

这也说明了所有可以在界面的帮助下完成的System.Collections.IList任务,这些任务也可以在System.Collections.Generic.IList<T>界面的帮助下完成。

如果是这样,那么更喜欢什么:System.Collections.IListSystem.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 的更高版本中引入的。

于 2019-08-10T21:52:24.700 回答