私はこのコードを持っている場合:C#:foreachマスター値は何回呼び出されますか?
foreach (Char c in myString.ToLowerInvariant())
{ /* code */ }
をmyString.ToLowerInvariant()
どのように何度も呼び出されますか?一度(私が仮定すると)または複数回?
私はこのコードを持っている場合:C#:foreachマスター値は何回呼び出されますか?
foreach (Char c in myString.ToLowerInvariant())
{ /* code */ }
をmyString.ToLowerInvariant()
どのように何度も呼び出されますか?一度(私が仮定すると)または複数回?
短い答えで返されます値のそれぞれをループ:
長い答えたら:
コードは、以下の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_002cにL_0021し、そこではないすべての文字がまだ処理されている場合に実行される行L_002eでジャンプ。 ToLowerInvariant呼び出しの後のL_0013にジャンプすることに注意してください。
一度...それはコール