【C#】for文の中で変数宣言する場合と外で宣言する場合の違い

宣言の場所の違いによるコード実行時の違いを見ていきましょう

for文の中で宣言する場合

C#コード

for (int i = 0; i < 10; i++)
{
    int x = i * 2;
    System.Console.WriteLine(x);
}

IL

// Method begins at RVA 0x206c
// Code size 31 (0x1f)
.maxstack 2
.entrypoint
.locals init (
    [0] int32 i,
    [1] int32 x,
    [2] bool
)

IL_0000: ldc.i4.0
IL_0001: stloc.0
// sequence point: hidden
IL_0002: br.s IL_0015
// loop start (head: IL_0015)
    IL_0004: nop
    IL_0005: ldloc.0
    IL_0006: ldc.i4.2
    IL_0007: mul
    IL_0008: stloc.1
    IL_0009: ldloc.1
    IL_000a: call void [System.Console]System.Console::WriteLine(int32)
    IL_000f: nop
    IL_0010: nop
    IL_0011: ldloc.0
    IL_0012: ldc.i4.1
    IL_0013: add
    IL_0014: stloc.0

    IL_0015: ldloc.0
    IL_0016: ldc.i4.s 10
    IL_0018: clt
    IL_001a: stloc.2
    // sequence point: hidden
    IL_001b: ldloc.2
    IL_001c: brtrue.s IL_0004
  // end loop

  IL_001e: ret
} // end of method Program::'<Main>$'

for文の外で宣言する場合

C#コード

int x;
for (int i = 0; i < 10; i++)
{
    x = i * 2;
    System.Console.WriteLine(x);
}

IL

// Method begins at RVA 0x206c
// Code size 31 (0x1f)
.maxstack 2
.entrypoint
.locals init (
    [0] int32 x,
    [1] int32 i,
    [2] bool
)

IL_0000: ldc.i4.0
IL_0001: stloc.1
// sequence point: hidden
IL_0002: br.s IL_0015
// loop start (head: IL_0015)
    IL_0004: nop
    IL_0005: ldloc.1
    IL_0006: ldc.i4.2
    IL_0007: mul
    IL_0008: stloc.0
    IL_0009: ldloc.0
    IL_000a: call void[System.Console]System.Console::WriteLine(int32)
    IL_000f: nop
    IL_0010: nop
    IL_0011: ldloc.1
    IL_0012: ldc.i4.1
    IL_0013: add
    IL_0014: stloc.1

    IL_0015: ldloc.1
    IL_0016: ldc.i4.s 10
    IL_0018: clt
    IL_001a: stloc.2
    // sequence point: hidden
    IL_001b: ldloc.2
    IL_001c: brtrue.s IL_0004
  // end loop

  IL_001e: ret
} // end of method Program::'<Main>$'

わかったこと

ILに変換された時、使っているローカル変数は違いますが、全く同じ動きをしているのがわかります
なので、処理速度は同じになります
for文の中で宣言する方が見やすいので、そちらを採用しましょう

C#

Posted by hidepon