IEnumerable的源代码是什么样的?

时间:2010-10-03 02:14:51

标签: c# interface ienumerable

我正在学习界面。我一直在阅读一些书籍/文章,到目前为止一直很好 - 我已经写了一些我自己的样本界面。耶:)

现在,我注意到最受欢迎的C#接口之一是IEnumerable接口。它被用于各种各样的收藏品等。

无论如何,我想检查一下,意图进一步了解它的实际运作方式。我搜索过Google,但我似乎无法找到对实际源代码的引用,但我想它会包含接口本身,以及包含各种方法的类。< / p>

那么,有人能帮忙吗?

非常感谢

6 个答案:

答案 0 :(得分:7)

IEnumerable非常简单:

[ComVisibleAttribute(True)]
[GuidAttribute("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
{
    IEnumerator GetEnumerator();
}

为了完整起见,IEnumerator

[ComVisibleAttribute(true)]
[GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
{
    Object Current {get;}
    bool MoveNext();
    void Reset();
}

但更常见的是,您在代码示例中看到的是IEnumerable<T>

public interface IEnumerable<out T> : IEnumerable
{
    IEnumerator<T> GetEnumerator();
    IEnumerator GetEnumerator(); //inherited from IEnumerable
}

再次为了完整性,IEnumerator<T>(与IDisposable):

public interface IEnumerator<out T> : IDisposable, IEnumerator
{

    void Dispose(); //inherited from IDsiposable
    Object Current {get;} //inherited from IEnumerator
    T Current {get;}
    bool MoveNext(); //inherited from IEnumerator
    void Reset(); //inherited from IEnumerator
}

[ComVisibleAttribute(true)]
public interface IDisposable
{
    void Dispose();
}

这就是它的全部内容。没有针对IEnumerable特有的任何直接实现代码或此处显示的相关代码。相反,类型如数组或List&lt; T&gt;将继承IEnumerable并实现所需的方法。除此之外的所有其他内容都是通过extension methods完成的。

这些物品的功能更加强大:

  1. C#的foreach关键字支持循环任何,它具有返回IEnumerator的GetEnumerator()方法,因此您可以使用任何使用foreach循环实现IEnumerable的类型。
  2. linq查询理解语法以类似的方式工作,这样您就可以将大多数IEnumerable与linq一起用于对象。
  3. yield关键字允许您创建名为iterator blocks的内容。 Iterator块具有一些简洁的属性(如延迟评估),并允许您轻松创建自己的IEnumerable类型,而无需首先解决定义新类的所有麻烦。
  4. 最后,值得指出的是IDisposable是另一个值得进一步研究的界面,因为它在框架中使用了很多,并且具有类似于IEnumerable的foreachusing关键字的直接语言支持

答案 1 :(得分:6)

IEnumerable<T>仅仅是一个定义:

的界面
public interface IEnumerable<T> : IEnumerable
{
    // Methods
    IEnumerator<T> GetEnumerator();
}

我假设您要调查的大多数方法来自一堆主要位于System.Linq System.Core.dll命名空间中的扩展方法。看看Reflector。

答案 2 :(得分:1)

接口不包含代码。

答案 3 :(得分:1)

自己找。

下载Reflector并使用它来浏览.NET框架本身。

Reflector可以在您选择的语言中显示IEnumerableIEnumerable<T>Enumerable的来源(它可以反编译为C#或VB或Delphi或......) )

答案 4 :(得分:0)

首先应该了解任何接口实现的设计模式,然后你就可以深入理解它。 IEnumerable接口实现Iterator设计模式。有时你会使用带有Composite模式的Iterator

答案 5 :(得分:0)

注意Mono Implementation(我建议检查它,并使用搜索工具搜索ClassName.cs,因为它有点难以找到一些东西)对于查找源代码很有用< / p>

Mono IEnumerable

Microsoft还将源代码作为共享源(外观但不要触摸/复制).net的副本发布,但我会远离它,特别是如果您可能重新实现其中的一部分或实现类似的类。