Code:
static void Main(string[] args)
{
foreach (Process p in Process.GetProcesses())
{
Console.WriteLine(p.ProcessName);
}
}
se prevodi u
Code:
locals init ([0] class [System]System.Diagnostics.Process p,
[1] class [System]System.Diagnostics.Process[] CS$00000007$00000000,
[2] int32 CS$00000008$00000001)
IL_0000: call class [System]System.Diagnostics.Process[] [System]System.Diagnostics.Process::GetProcesses() // Poziva se samo jednom
IL_0005: stloc.1 // i smesta u CS$00000007$00000000
IL_0006: ldc.i4.0
IL_0007: stloc.2 // kreira novu promenljivu (CS$00000008$00000001) koju ce da koristi za inkrementiranje
IL_0008: br.s IL_001d // bezuslovno ide na IL_001d - pocetak petlje
IL_000a: ldloc.1
IL_000b: ldloc.2
IL_000c: ldelem.ref // uzima referencu i-tog elementa u nizu procesa
IL_000d: stloc.0 // i smesta u p
IL_000e: ldloc.0
IL_000f: callvirt instance string [System]System.Diagnostics.Process::get_ProcessName()
IL_0014: call void [mscorlib]System.Console::WriteLine(string)
IL_0019: ldloc.2
IL_001a: ldc.i4.1
IL_001b: add // inkrementira CS$00000008$00000001
IL_001c: stloc.2
IL_001d: ldloc.2
IL_001e: ldloc.1
IL_001f: ldlen
IL_0020: conv.i4
IL_0021: blt.s IL_000a // poredi CS$00000008$00000001 sa duzinom niza - ukoliko je manje ide na IL_000a
IL_0023: ret
Tako da se Process.GetProcesses() izvrsava samo jednom posto se interno sve odvija na neki nacin kao for petlja, tj. - for (int i = 0; i < Process.GetProcesses().Length; i++)...
Pozdrav!
If it's a girl then they're gonna call it Sigourney, after an actress. If it's a boy, then they're gonna call it Rodney, after Dave!