2013-02-13 3 views
1

Я использую доходность и где-то попал, может кто-нибудь объяснить, как работает доход мой scenerio показан ниже.Как доходность работает в C#

public static IEnumerable Power(int number, int exponent) 
{ 
    int result = 1; 
    int counter = 0; 
    Console.WriteLine("Inside Power - Before While"); 
    while (counter++ < exponent) 
    { 
     Console.WriteLine("Inside Power - Inside While"); 
     result = result * number; 
     yield return result; 
     //Console.WriteLine("New line added"); 
    } 
    Console.WriteLine("Inside Power - After While"); 
} 

static void Main(string[] args) 
{ 
    foreach (int i in Power(2, 8)) 
    { 
     Console.WriteLine("{0}", i); 
    } 
} 

Так на выходе мы получаем здесь

Inside Power - Before While 
Inside power - Inside While 
2 
Inside power - Inside While 
4 
Inside power - Inside While 
8 
Inside power - Inside While 
16 
Inside power - Inside While 
32 
Inside power - Inside While 
64 
Inside power - Inside While 
128 
Inside power - Inside While 
256 
Inside power - AfterWhile 

Так что мой вопрос, как указатель смещается от Еогеасп к перечислимых метода во время цикла и печатает и так далее. Почему весь метод не вызывается и только цикл цикла выполняется каждый раз.

+0

Для подробного обсуждения этой темы прочитайте [это сообщение в блоге] (http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx). –

+0

Вы можете думать о выходе как о «продолжении». Когда вы даете значение, актер может получить значение, в следующий раз, когда вы запросите значение, он вернется туда, где он остановился в функции уступчивости, и продолжайте, как будто он никогда не покидал функцию. – devshorts

+0

Thanx, я прочитал этот пост, но я хочу знать об этом выходе. Но спасибо за понимание внутреннего потока – user1006544

ответ

1

Оператор возврата доходности семантически эквивалентен оператору return (который передает управляющий поток вызывающему методу), а затем «goto» в оператор yield в следующей итерации цикла foreach.

Return 
Goto 

Такое поведение не существует в среде Common Language Runtime. Он реализуется классом, сгенерированным компилятором C#. Затем это выполняется и JIT-компилируется CLR. Выход - это форма синтаксического сахара.

Смежные вопросы