F. Iván Asked: 2020-05-18 06:26:17 +0800 CST 2020-05-18 06:26:17 +0800 CST 2020-05-18 06:26:17 +0800 CST IEnumerable、ICollection 和 IList 之间有什么区别,应该在什么时候使用它们? 772 IEnumerable接口之间ICollection有区别IList吗? 在我的开发中应该在什么时候使用每个接口? c# 2 Answers Voted Best Answer F. Iván 2020-05-18T06:26:17+08:002020-05-18T06:26:17+08:00 可数: 它位于System.Collections命名空间中。定义了两个接口:一个通用接口和一个非通用接口。你可以在它的接口定义中看到它: public interface IEnumerable<out T> : IEnumerable { IEnumerator<T> GetEnumerator(); } 该方法GetEnumerator将返回实现接口的类的对象的实例,该接口IEnumerator实现两个方法,MoveNext()和Reset()。它还有一个名为的属性Current,用于返回列表中的当前项目。作为主要功能,IEnumerables 可以使用foreach. iCollection 和上一个一样,我们也有两个定义,一个是通用的,一个不是。 public interface ICollection<T> : IEnumerable<T>, IEnumerable { int Count { get; } bool IsReadOnly { get; } void Add(T item); void Clear(); bool Contains(T item); void CopyTo(T[] array, int arrayIndex); bool Remove(T item); } 我们首先要注意的是它继承自IEnumerable,所以它允许我们使用上面提到的方法。它们也可以被遍历,但与前一个不同的是,这个可以改变。 列表 与前两个一样,该库包含两个定义,一个是泛型的,一个是非泛型的。 public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable { T this[int index] { get; set; } int IndexOf(T item); void Insert(int index, T item); void RemoveAt(int index); } 可以看到,在实现之前的接口时,可以使用自己的方法,也可以使用自己的方法,我们可以看到,这些方法与位置有关。 现在......你应该什么时候使用每一个? 答案是这取决于您的代码需要什么级别的可访问性: IEnumerable: 它只能迭代集合的元素,所以它应该在需要只读访问时使用。 ICollection:允许您遍历元素并访问它们,因此当您想要访问、更改或了解集合的大小时应该使用它。 IList:允许以上所有加上索引,这意味着存储数据的位置很重要。所以当你想要一个有序的集合或访问特定的位置时应该使用它。 Andres Lozada Mosto 2020-09-07T06:24:56+08:002020-09-07T06:24:56+08:00 @Fran 的解释非常好,我想补充一点。 在选择要使用的列表类型时,除了界面之外,您还必须选择要使用的集合。集合可以实现您提到的一个或多个接口,因此集合实现者可以具有@Fran 提到的一个或多个“能力”。 知道是要在集合中存储相同类型的对象还是不同类型的对象是非常重要的,即在集合中保存(并且只允许)Person类的对象或将对象保存在集合字符串中,int,人、狗等 在此链接https://www.tutorialsteacher.com/csharp/csharp-collection中,您可以看到一个类图,您可以在其中看到接口和实现它的类是如何相关的。在这种情况下,互补允许混合数据类型。在这个其他链接中https://www.tutorialsteacher.com/csharp/csharp-generic-collections提到了哪些集合,它们只允许存储相同类型的元素。 您可以看到 ICollection 扩展到了其他两个接口,并且所有实现都实现了这个接口,因此它们同时实现了所有 3 个。重要的是,在方法签名中,您始终使用其中一个接口,以免耦合一种特定实现的方法。
可数:
它位于System.Collections命名空间中。定义了两个接口:一个通用接口和一个非通用接口。你可以在它的接口定义中看到它:
该方法
GetEnumerator
将返回实现接口的类的对象的实例,该接口IEnumerator
实现两个方法,MoveNext()
和Reset()
。它还有一个名为的属性Current
,用于返回列表中的当前项目。作为主要功能,IEnumerables 可以使用foreach
.iCollection
和上一个一样,我们也有两个定义,一个是通用的,一个不是。
我们首先要注意的是它继承自
IEnumerable
,所以它允许我们使用上面提到的方法。它们也可以被遍历,但与前一个不同的是,这个可以改变。列表
与前两个一样,该库包含两个定义,一个是泛型的,一个是非泛型的。
可以看到,在实现之前的接口时,可以使用自己的方法,也可以使用自己的方法,我们可以看到,这些方法与位置有关。
现在......你应该什么时候使用每一个?
答案是这取决于您的代码需要什么级别的可访问性:
@Fran 的解释非常好,我想补充一点。
在选择要使用的列表类型时,除了界面之外,您还必须选择要使用的集合。集合可以实现您提到的一个或多个接口,因此集合实现者可以具有@Fran 提到的一个或多个“能力”。
知道是要在集合中存储相同类型的对象还是不同类型的对象是非常重要的,即在集合中保存(并且只允许)Person类的对象或将对象保存在集合字符串中,int,人、狗等
在此链接https://www.tutorialsteacher.com/csharp/csharp-collection中,您可以看到一个类图,您可以在其中看到接口和实现它的类是如何相关的。在这种情况下,互补允许混合数据类型。在这个其他链接中https://www.tutorialsteacher.com/csharp/csharp-generic-collections提到了哪些集合,它们只允许存储相同类型的元素。
您可以看到 ICollection 扩展到了其他两个接口,并且所有实现都实现了这个接口,因此它们同时实现了所有 3 个。重要的是,在方法签名中,您始终使用其中一个接口,以免耦合一种特定实现的方法。