instrukcja yield w IL

0

To jest fragment implementacji w IL instrukcji yield Czy może mi ktoś wytłumaczyć jak to działa .

        instance class [mscorlib]System.Collections.IEnumerator 
        GetEnumerator() cil managed
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.IteratorStateMachineAttribute::.ctor(class [mscorlib]System.Type) = ( 01 00 2B 43 6F 6E 73 6F 6C 65 41 70 70 32 2E 4D   // ..+ConsoleApp2.M
                                                                                                                                        79 43 6F 6C 65 63 74 69 6F 6E 2B 3C 47 65 74 45   // yColection+<GetE
                                                                                                                                        6E 75 6D 65 72 61 74 6F 72 3E 64 5F 5F 32 00 00 ) // numerator>d__2..
  // Code size       14 (0xe)
  .maxstack  8
  IL_0000:  ldc.i4.0
  IL_0001:  newobj     instance void ConsoleApp2.MyColection/'<GetEnumerator>d__2'::.ctor(int32)
  IL_0006:  dup
  IL_0007:  ldarg.0
  IL_0008:  stfld      class ConsoleApp2.MyColection ConsoleApp2.MyColection/'<GetEnumerator>d__2'::'<>4__this'
  IL_000d:  ret
} // end of method MyColection::GetEnumerator

a program w C# wygląda tak :

using System;
using System.Collections;
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] tab = new int[10];
            for (int i = 0; i < 10; i++)
            {
                tab[i] = i * i;
            }
            MyColection ob = new MyColection(tab);
            foreach (int elm in ob)
            {
                Console.WriteLine(elm);
            }
        }
    }
    class MyColection : IEnumerable
    {
        int[] data;
        public MyColection(int[] tab)
        {
            data = tab;
        }
        public IEnumerator GetEnumerator()
        {
            foreach (int i in data)
            {
                yield return i;
            }
        }
    }
}
0

@0xmarcin: Fajnie że to się wyjaśniło bo już straciłem wiarę w programowanie. Wpadłem na ten sam pomysł zanim przeczytałem twoją odpowiedź. Dawno się nie zajmowałem IL i stąd to zaćmienie umysłu.
Na szczęście na ma cudów w programowaniu i wszystko da się sensownie wyjaśnić. W tym kodzie doszła jedna zmienna, której nie ma w oryginale ale to jest wyłącznie kwestia optymalizacji kodu w IL . Jeszcze tego nie skompilowałem żeby porównać kod bo muszę poprawić identyfikatory na zgodne z C#.
Wielkie dzięki za pomoc !!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1