Как выглядит исходный код IEnumerable? - PullRequest
3 голосов
/ 03 октября 2010

Я в процессе изучения интерфейсов.Я перечитал некоторые книги / статьи и пока все хорошо - я написал несколько собственных примеров интерфейсов.Yay:)

Теперь я заметил, что одним из самых популярных интерфейсов C # является интерфейс IEnumerable.Он довольно часто используется для всевозможных коллекций и т. Д.

В любом случае, я хотел бы изучить его, чтобы понять, как он на самом деле работает.Я искал в Google, но не могу найти ссылку на фактический исходный код, но я предполагаю, что он будет содержать сам интерфейс и класс (ы), содержащие различные методы .

Итак, кто-нибудь может помочь?

Очень ценится

Ответы [ 6 ]

7 голосов
/ 03 октября 2010

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

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

И снова для полноты IEnumerator 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 будут наследоваться от IEnumerable и реализовывать необходимые методы.Все остальное, кроме этого, делается с помощью методов расширения .

. Что делает его еще более мощным, так это следующие элементы:

  1. C # * foreach поддерживает зацикливание что-нибудь , которое имеет метод GetEnumerator(), который возвращает IEnumerator, и поэтому вы можете использовать любой тип, который реализует IEnumerable с циклом foreach.
  2. Синтаксис понимания запросов linq работает аналогичным образом, такой, что вы можете использовать практически любой IEnumerable с linq для объектов.
  3. Ключевое слово yield позволяет вам создать нечто, называемое итераторными блоками .Блоки итераторов имеют некоторые аккуратные свойства (например, ленивая оценка) и позволяют легко создавать собственные типы IEnumerable без необходимости сначала определять новый класс.

Наконец, стоит отметитьздесь IDisposable - еще один интерфейс, заслуживающий дальнейшего изучения, так как он довольно часто используется в фреймворке и имеет прямую языковую поддержку, аналогичную IEnumerable foreach с ключевым словом using.

6 голосов
/ 03 октября 2010

IEnumerable<T> - это просто интерфейс, который определяет:

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

Большинство методов, которые, как я предполагаю, вы хотите исследовать, происходят из набора методов расширения, которые в основном живут в пространстве имен System.Linq в * 1006.*.Взгляните на Reflector.

1 голос
/ 03 октября 2010

Ищите сами.

Скачать Reflector и использовать его для просмотра самой платформы .NET.

Reflector может показать вам, как выглядит источник для IEnumerable, IEnumerable<T> и Enumerable, на вашем языке (он может декомпилироваться в C # или VB или Delphi или ...)

1 голос
/ 03 октября 2010

Интерфейсы не содержат код.

0 голосов
/ 03 октября 2010

Обратите внимание на реализацию Mono (я бы порекомендовал проверить ее и использовать инструмент поиска для поиска ClassName.cs, так как некоторые вещи могут быть немного сложными), это хорошо для поискаисходный код

Mono IEnumerable

Microsoft также выпускает исходный код в виде Shared Source (смотрите, но не трогайте / копируйте) копию .net, но я бы осталсяподальше от него, особенно если вы когда-нибудь сможете переопределить его часть или реализовать похожие классы.

0 голосов
/ 03 октября 2010

сначала вы должны понять шаблон проектирования под реализацией любого интерфейса, затем вы можете его глубоко понять.IEnumerable интерфейс реализует Итератор шаблон проектирования.Когда-нибудь вы будете использовать Iterator с Composite pattern

...