IList和IList <t> </t>之间有什么区别

时间:2012-12-22 12:03:49

标签: c# .net generics collections

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

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

带有和不带T的界面有什么变化带来IList,即如果我的一个类实现IList<T>而不是IList,那么我可以将它用作我的自定义集合或不上课?

3 个答案:

答案 0 :(得分:11)

List<T>实现IList<T>IList的原因是为了让它可以在您的代码假设IList的任何地方使用。这样可以更容易地转换为通用IList<T>,因为它更合适。此外,如果您有一个.net 1.1或更早版本的代码,即使您的类是在.net 2.0或更高版本的程序集中实现的,它也可以重用它。

答案 1 :(得分:5)

IList<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());

答案 2 :(得分:0)

问题:

IListIList<T>有什么区别?

答案:

IListIList<T>都是接口,但是IList不是通用的,并且既是System.Collections成员又属于IList<T>命名空间,而System.Collections.Generic是通用,它既是System.Collections.IList命名空间的成员,又属于该命名空间。

System.Collections.Generic.IList<object>也与object等同且相同。

由于T在C#中可以是任何类型,并且可以在尖括号内的通用类型object中使用的每种类型都扩展了System.Collections.IList,这意味着{{ 1}}和System.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");时,将引发强制转换失败异常,然后应用程序停止执行并终止。

如果所有程序员和开发人员都找不到该错误,谁知道哪个客户会发现此错误。

这就是为什么命名空间IList<T>的所有通用类和接口(包括System.Collections.Generic)比命名空间的所有类和接口(包括IList)好得多的原因System.CollectionsSystem.Collections.Generic应该是一般推荐的命名空间

从历史上看,命名空间System.Collections以及此命名空间中定义的所有类和接口(包括接口IList)早于命名空间System.Collections.Generic及其所有类和接口(包括{ {1}}通用接口。

命名空间IList<T>及其所有类和接口是在更高版本的Microsoft .NET Framework中引入的。