非通用IEnumerable和通用IEnumerable <t>?</t>之间有什么区别

时间:2011-04-03 03:17:43

标签: c# generics syntax ienumerable

很抱歉这个模糊的问题,但我一直在寻找一天中最好的部分,我已经阅读了文章(这里有很多问题),但是找不到一个容易理解的答案。

我(我想)知道IEnumerable的用途是什么,但我无法理解用泛型类型参数定义它意味着什么,例如:

IEnumerable<int> test = method();

这只是让我发疯!请让我摆脱痛苦并解释它的含义?

5 个答案:

答案 0 :(得分:13)

IEnumerable基本上是一组对象。它具有方法GetEnumerator(),允许您遍历可枚举中的所有对象。

IEnumerable<int>基本上是整数的集合。它有方法GetEnumerator(),它允许你遍历枚举中的所有整数。

IEnumerable<int> test = method();表示如果来自某个地方的整数,method()正在获取集合。它可以是List,数组或其他一些数据类型,但它绝对是它们的一组,它们都是整数,并且您可以遍历它们。

这篇文章也许有帮助:What's the difference between IEnumerable and Array, IList and List?

答案 1 :(得分:2)

我只是想到IEnumerable<int>,就像我想到的List<int>一样,我想这会更自然。需要注意的是IEnumerable<int>并不像List<int>那么多,而且基本上它只是一个可以枚举的事物

答案 2 :(得分:2)

IEnumerableGetEnumerator方法,该方法将返回IEnumerator,其Current方法将返回ObjectIEnumerable<T>有一个GetEnumerator方法会返回IEnumerator<T>,其Current方法将返回T。如果事先知道枚举器要返回的对象的预期类型,通常最好使用通用表单。

另一个区别是IEnumerator<T>继承IDisposable,它允许使用枚举器完成的代码在其上调用Dispose,而不必担心它是否受支持。相比之下,当使用非通用IEnumerator时,有必要测试它是IDisposable并在其上调用Dispose,如果是这样的话。请注意,使用非通用形式的IEnumerable / IEnumerator并不能减轻调用Dispose的要求之一。例如,将vb样式的集合强制转换为IEnumerable,然后在不调用GetEnumerator的情况下调用Dispose 100,000次将非常缓慢(很多秒,即使在i7上),除非垃圾 - 收集恰好发生。每次通话后处理IEnumerator将加速一百多倍。

答案 3 :(得分:0)

您正在寻找的单词是“泛型”,您给出的示例是IEnumerable,它被用作int类型项的泛型。这意味着您正在使用的IEnumerable集合是强类型的,只能保存int对象而不是任何其他类型。

Google“C#generics IEnumerable”,您可以在此找到所需的所有信息。

答案 4 :(得分:0)

IEnumerable意味着它可以在foreach循环中使用。

test可以

的形式使用
foreach(int item : test)
{
   console.writeline(item);
}