IEnumerable <T>GetEnumerator () exexcution - PullRequest
       29

IEnumerable <T>GetEnumerator () exexcution

0 голосов
/ 03 января 2011

Итак, один из моих классов реализует IQueryable, для чего ему нужен метод GetEnumerator, а код выглядит так:

        public IEnumerator<T> GetEnumerator() 
        {
             this.ParseExpression(this.expression);
             return this.GetResults()

        }

        private IEnumerator<T> GetResults() 
        {
              //Processes the expression tree.

              T t = Activator.CreateInstance(typeof(T));
              yield return T;
        }

Странная часть: когда элемент управления входит в первый метод, он пропускает его до конца (закрывающая фигурная скобка, прежде чем он входит в метод GetResults (). Означает ли это, что метод GetResults () выполняется неявно в другом потоке компилятором из-за того, что класс реализует IEnumerable?

1 Ответ

4 голосов
/ 03 января 2011

Нет, это означает, что компилятором добавлено больше кода, который вы не видите выполненным, поскольку нет исходного кода, представляющего его.

Когда вы используете yield, компилятор создает реализацию перечислителя для вас. Вызов GetResults на самом деле не вызывает ваш метод, вместо этого он вызывает конструктор этого перечислителя. Когда вы начинаете читать из перечислителя, ваш метод вызывается впервые.

...