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;
}
}
}
}