C#: Сколько раз вызывается значение foreach master?
Если у меня есть этот код:
foreach (Char c in myString.ToLowerInvariant())
{ /* code */ }
Сколько раз будет myString.ToLowerInvariant()
позвонить? Один раз (что я предполагаю) или несколько раз?
2 ответа
Краткий ответ: однажды
Длинный ответ:
Код компилируется в следующий IL. Вы можете попробовать сами, скомпилировав файл C# и открыв его в ILDASM (поставляется с Visual Studio) или.NET Reflector (который может отображать дизассемблированный код на многих языках и имеет подсказки для инструкций IL с подробным описанием).
L_0008: ldloc.0
L_0009: callvirt instance string [mscorlib]System.String::ToLowerInvariant()
L_000e: stloc.2
L_000f: ldc.i4.0
L_0010: stloc.3
L_0011: br.s L_0021
L_0013: ldloc.2
L_0014: ldloc.3
L_0015: callvirt instance char [mscorlib]System.String::get_Chars(int32)
L_001a: stloc.1
L_001b: nop
L_001c: nop
L_001d: ldloc.3
L_001e: ldc.i4.1
L_001f: add
L_0020: stloc.3
L_0021: ldloc.3
L_0022: ldloc.2
L_0023: callvirt instance int32 [mscorlib]System.String::get_Length()
L_0028: clt
L_002a: stloc.s flag
L_002c: ldloc.s flag
L_002e: brtrue.s L_0013
Фактическое состояние цикла проверяется в строках с L_0021 по L_002c, а затем происходит переход на строку L_002e, которая выполняется, если еще не все символы обработаны. Обратите внимание, что он переходит к L_0013, который идет после вызова ToLowerInvariant.
Один раз... затем он перебирает все значения, возвращаемые вызовом