我正在学习界面。我一直在阅读一些书籍/文章,到目前为止一直很好 - 我已经写了一些我自己的样本界面。耶:)
现在,我注意到最受欢迎的C#接口之一是IEnumerable接口。它被用于各种各样的收藏品等。
无论如何,我想检查一下,意图进一步了解它的实际运作方式。我搜索过Google,但我似乎无法找到对实际源代码的引用,但我想它会包含接口本身,以及包含各种方法的类。< / p>
那么,有人能帮忙吗?
非常感谢
答案 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完成的。
这些物品的功能更加强大:
foreach
关键字支持循环任何,它具有返回IEnumerator的GetEnumerator()
方法,因此您可以使用任何使用foreach循环实现IEnumerable的类型。 yield
关键字允许您创建名为iterator blocks的内容。 Iterator块具有一些简洁的属性(如延迟评估),并允许您轻松创建自己的IEnumerable类型,而无需首先解决定义新类的所有麻烦。最后,值得指出的是IDisposable是另一个值得进一步研究的界面,因为它在框架中使用了很多,并且具有类似于IEnumerable的foreach
和using
关键字的直接语言支持
答案 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可以在您选择的语言中显示IEnumerable
,IEnumerable<T>
和Enumerable
的来源(它可以反编译为C#或VB或Delphi或......) )
答案 4 :(得分:0)
答案 5 :(得分:0)
注意Mono Implementation(我建议检查它,并使用搜索工具搜索ClassName.cs,因为它有点难以找到一些东西)对于查找源代码很有用< / p>
Microsoft还将源代码作为共享源(外观但不要触摸/复制).net的副本发布,但我会远离它,特别是如果您可能重新实现其中的一部分或实现类似的类。