Цитата(klem4 @ 24.03.2008 7:56) 

 Код
foreach (Process p in Process.GetProcesses()) 
Так конечно короче, но чисто теоретически не рискуем ли мы тут получить бесконечный цикл ? Или вызов метода GetProcesses() произойдет только один раз ?
 Вызов метода GetProcesses произойдет один раз.
Для программы 
Код
static void Main(string[] args) {
    foreach (Process p in Process.GetProcesses()) {
        Console.WriteLine("process '{0}':", p.ProcessName);
    }
    Console.ReadLine();
}
 Компилер сгенерирует следующий код
Код
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       47 (0x2f)
  .maxstack  2
  .locals init ([0] class [System]System.Diagnostics.Process p,
           [1] class [System]System.Diagnostics.Process[] CS$6$0000,
           [2] int32 CS$7$0001)
  IL_0000:  call       class [System]System.Diagnostics.Process[] [System]System.Diagnostics.Process::GetProcesses()
  IL_0005:  stloc.1
  IL_0006:  ldc.i4.0
  IL_0007:  stloc.2
  IL_0008:  br.s       IL_0022
  IL_000a:  ldloc.1
  IL_000b:  ldloc.2
  IL_000c:  ldelem.ref
  IL_000d:  stloc.0
  IL_000e:  ldstr      "process '{0}':"
  IL_0013:  ldloc.0
  IL_0014:  callvirt   instance string [System]System.Diagnostics.Process::get_ProcessName()
  IL_0019:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_001e:  ldloc.2
  IL_001f:  ldc.i4.1
  IL_0020:  add
  IL_0021:  stloc.2
  IL_0022:  ldloc.2
  IL_0023:  ldloc.1
  IL_0024:  ldlen
  IL_0025:  conv.i4
  IL_0026:  blt.s      IL_000a
  IL_0028:  call       string [mscorlib]System.Console::ReadLine()
  IL_002d:  pop
  IL_002e:  ret
} // end of method Program::Main
Как показывает дизассемблер, получение массива происходит один раз - самой первой инструкцией.