IEnumerable的源代码是什么样的?

Mar*_*rko 3 c# ienumerable interface

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

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

无论如何,我想检查它,意图进一步了解它是如何工作的.我搜索过谷歌,但我似乎无法找到对实际源代码的引用,但我想它会包含接口本身,以及包含各种方法的类.

那么,有人能帮忙吗?

非常感激

Joe*_*orn 7

IEnumerable非常简单:

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

而且为了完整性,IEnumerator

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

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

public interface IEnumerable<out T> : IEnumerable
{
    IEnumerator<T> GetEnumerator();
    IEnumerator GetEnumerator(); //inherited from IEnumerable
}
Run Code Online (Sandbox Code Playgroud)

而且为了完整性,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();
}
Run Code Online (Sandbox Code Playgroud)

这就是它的全部内容.没有针对IEnumerable特有的任何直接实现代码或此处显示的相关代码.相反,像数组或List <T>这样的类型将继承IEnumerable并实现所需的方法.除此之外的所有其他事情都通过扩展方法完成.

使这一切变得更加强大的是这些项目:

  1. C#的foreach关键字支持循环任何具有GetEnumerator()返回IEnumerator 的方法的东西,因此您可以使用任何使用foreach循环实现IEnumerable的类型.
  2. linq查询理解语法以类似的方式工作,这样您就可以将大多数IEnumerable与linq一起用于对象.
  3. yield关键字允许您创建一个名为迭代器块的东西.迭代器块具有一些简洁的属性(如惰性求值),并允许您轻松创建自己的IEnumerable类型,而无需首先解决定义新类的麻烦.

最后,值得指出的是这里的IDisposable是另一个接口值得进一步研究,因为它使用相当多的框架,并具有类似的IEnumerable的直接语言支持foreachusing关键字.


spe*_*der 6

IEnumerable<T> 仅仅是一个定义的接口:

public interface IEnumerable<T> : IEnumerable
{
    // Methods
    IEnumerator<T> GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

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