C#:foreach主值被调用了多少次?

时间:2009-08-16 09:43:08

标签: c# loops foreach

如果我有这段代码:

foreach (Char c in myString.ToLowerInvariant())
{ /* code */ }

myString.ToLowerInvariant()会被叫多少次?一次(我假设)或多次?

2 个答案:

答案 0 :(得分:8)

简短回答:一次

答案很长:

代码被编译成以下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调用之后。

答案 1 :(得分:2)

一次......然后循环遍历调用返回的每个值