C# IEnumerable的源代码是什么样子的?

C# IEnumerable的源代码是什么样子的?,c#,interface,ienumerable,C#,Interface,Ienumerable,我正在学习界面。我一直在阅读一些书籍/文章,到目前为止还不错——我自己编写了一些示例接口。耶:) 现在,我注意到最流行的C接口之一是IEnumerable接口。它被大量用于各种收藏等 无论如何,我想检查一下,目的是进一步了解它实际上是如何工作的。我搜索过谷歌,但似乎找不到对实际源代码的引用,但我想它将包含接口本身,以及包含各种方法的类 那么,有人能帮忙吗 非常受欢迎的接口不包含代码。IEnumerable只是一个定义以下内容的接口: public interface IEnumerable<

我正在学习界面。我一直在阅读一些书籍/文章,到目前为止还不错——我自己编写了一些示例接口。耶:)

现在,我注意到最流行的C接口之一是IEnumerable接口。它被大量用于各种收藏等

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

那么,有人能帮忙吗


非常受欢迎的

接口不包含代码。

IEnumerable
只是一个定义以下内容的接口:

public interface IEnumerable<T> : IEnumerable
{
    // Methods
    IEnumerator<T> GetEnumerator();
}
公共接口IEnumerable:IEnumerable
{
//方法
IEnumerator GetEnumerator();
}
我假设您要研究的大多数方法都来自一系列扩展方法,它们主要存在于
System.Core.dll
中的
System.Linq
命名空间中。用反射器看一看。

自己看一看

下载并使用它浏览.NET framework本身


Reflector可以向您展示
IEnumerable
IEnumerable
Enumerable
的源代码,使用您选择的语言(它可以反编译为C#或VB或Delphi或…)

您应该首先了解任何接口实现下的设计模式,那你就可以深刻地理解它了。IEnumerable接口实现集设计模式。有时您将使用迭代器和模式

非常简单:

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

但更多时候,您在代码示例中真正看到的是

公共接口IEnumerable:IEnumerable
{
IEnumerator GetEnumerator();
IEnumerator GetEnumerator();//从IEnumerable继承
}
同样,为了完整性,(与):

公共接口IEnumerator:IDisposable,IEnumerator
{
void Dispose();//从IDsiposable继承
对象当前{get;}//从IEnumerator继承
T当前{get;}
bool MoveNext();//从IEnumerator继承
void Reset();//从IEnumerator继承
}
[ComVisibleAttribute(真实)]
公共接口IDisposable
{
无效处置();
}
这就是一切。没有针对IEnumerable的直接实现代码或此处显示的相关代码。相反,数组或列表等类型将继承IEnumerable并实现所需的方法。除此之外的一切都是通过

让它更强大的是以下几项:

  • C#的
    foreach
    关键字支持对任何具有返回IEnumerator的
    GetEnumerator()
    方法的对象进行循环,因此您可以使用任何通过foreach循环实现IEnumerable的类型
  • linq查询理解语法的工作方式与此类似,因此您可以将大多数IEnumerable与linq to对象一起使用
  • yield
    关键字允许您创建一个名为。迭代器块具有一些简洁的属性(如惰性求值),允许您轻松创建自己的IEnumerable类型,而无需先定义一个新类
  • 最后,值得在此指出的是,IDisposable是另一个值得进一步研究的界面,因为它在框架中使用得相当多,并且具有直接的语言支持,类似于IEnumerable的
    foreach
    ,其中
    使用
    关键字(我建议您检查一下,并使用搜索工具搜索ClassName.cs,因为查找某些内容可能有点困难)这对查找源代码很有帮助


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

    那么你是说IEnumerable的内置方法是空白的?@Marko,这就是接口。合同的定义,仅此而已。你提供了实现。虽然这部分是正确的,但这是相当粗鲁的。从技术上讲,是有代码的。我特别提到了接口本身及其使用的方法。上次我检查时,这个网站是为了帮助其他用户,而不是为了厚颜无耻。@Marko,你需要理解接口不使用任何方法。它不使用任何东西。使用意味着实现。没有。接口定义方法,定义通过方法签名的需求。这是您必须履行的契约。特别是对于
    IEnumerable
    ,它精确地定义了一个返回
    IEnumerator
    且不带参数的方法。作为开发人员,您可以决定该方法的实际工作方式,以及在该过程中将使用哪些其他方法。@Marko Brian的p要点是,您只需查看界面即可看到它(例如,在Visual Studio中右键单击并转到“转到定义”)。合同就在那里,反编译它不会再向您显示任何内容。谢谢您spender,我将下载Reflector并开始调查。这就是我所需要的全部!:)非常感谢您的帮助,我的下一个问题可能与IDisposable相关:)在这里还需要添加一个小细节,即虽然
    IEnumerable
    不继承
    IDisposable
    (与
    IEnumerable
    不同,
    foreach
    的代码将相当于
    if(枚举器是IDisposable的){((IDisposable)枚举器).Dispose();}
    因此,如果可能,仍将处理此类对象。在创建
    IEnumerable
    时添加
    IDisposable
    支持,使这对编码人员来说更高效、更明确,但等效功能始终存在
    [ComVisibleAttribute(true)]
    [GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
    public interface IEnumerator
    {
        Object Current {get;}
        bool MoveNext();
        void Reset();
    }
    
    public interface IEnumerable<out T> : IEnumerable
    {
        IEnumerator<T> GetEnumerator();
        IEnumerator GetEnumerator(); //inherited from IEnumerable
    }
    
    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();
    }