Цитата(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
Как показывает дизассемблер, получение массива происходит один раз - самой первой инструкцией.