Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Previous answer deleted as I'd misread the code. (Using "default(bool)" anywhere is a bit odd, btw.)</p> <p>However, unless the variable is captured by a delegate etc, I'd expect them to <em>either</em> compile to IL which is effectively the same (in terms of both behaviour and performance).</p> <p>As ever, write the most <em>readable</em> code first. Micro-optimising things like this is asking for trouble. I agree with the others who have suggested that you restrict the scope of variables as much as you can - so if you need it after the loop, you haven't got any choice anyway; otherwise declare it inside.</p> <p>Okay, here's a test program:</p> <pre><code>using System; class Test { static void Main() {} static void DeclareInside() { for (int i=0; i &lt; 10; i++) { bool x = false; for (int j=5; j &lt; 20; j++) { if (i == j) { x = true; break; } if (x) { Console.WriteLine("Yes"); } } } } static void DeclareOutside() { bool x; for (int i=0; i &lt; 10; i++) { x = false; for (int j=5; j &lt; 20; j++) { if (i == j) { x = true; break; } if (x) { Console.WriteLine("Yes"); } } } } } </code></pre> <p>Generated IL (just <code>csc Test.cs</code>):</p> <pre><code>.method private hidebysig static void DeclareOutside() cil managed { // Code size 79 (0x4f) .maxstack 2 .locals init (bool V_0, int32 V_1, int32 V_2, bool V_3) IL_0000: nop IL_0001: ldc.i4.0 IL_0002: stloc.1 IL_0003: br.s IL_0045 IL_0005: nop IL_0006: ldc.i4.0 IL_0007: stloc.0 IL_0008: ldc.i4.5 IL_0009: stloc.2 IL_000a: br.s IL_0037 IL_000c: nop IL_000d: ldloc.1 IL_000e: ldloc.2 IL_000f: ceq IL_0011: ldc.i4.0 IL_0012: ceq IL_0014: stloc.3 IL_0015: ldloc.3 IL_0016: brtrue.s IL_001d IL_0018: nop IL_0019: ldc.i4.1 IL_001a: stloc.0 IL_001b: br.s IL_0040 IL_001d: ldloc.0 IL_001e: ldc.i4.0 IL_001f: ceq IL_0021: stloc.3 IL_0022: ldloc.3 IL_0023: brtrue.s IL_0032 IL_0025: nop IL_0026: ldstr "Yes" IL_002b: call void [mscorlib]System.Console::WriteLine(string) IL_0030: nop IL_0031: nop IL_0032: nop IL_0033: ldloc.2 IL_0034: ldc.i4.1 IL_0035: add IL_0036: stloc.2 IL_0037: ldloc.2 IL_0038: ldc.i4.s 20 IL_003a: clt IL_003c: stloc.3 IL_003d: ldloc.3 IL_003e: brtrue.s IL_000c IL_0040: nop IL_0041: ldloc.1 IL_0042: ldc.i4.1 IL_0043: add IL_0044: stloc.1 IL_0045: ldloc.1 IL_0046: ldc.i4.s 10 IL_0048: clt IL_004a: stloc.3 IL_004b: ldloc.3 IL_004c: brtrue.s IL_0005 IL_004e: ret } // end of method Test::DeclareOutside .method private hidebysig static void DeclareInside() cil managed { // Code size 79 (0x4f) .maxstack 2 .locals init (int32 V_0, bool V_1, int32 V_2, bool V_3) IL_0000: nop IL_0001: ldc.i4.0 IL_0002: stloc.0 IL_0003: br.s IL_0045 IL_0005: nop IL_0006: ldc.i4.0 IL_0007: stloc.1 IL_0008: ldc.i4.5 IL_0009: stloc.2 IL_000a: br.s IL_0037 IL_000c: nop IL_000d: ldloc.0 IL_000e: ldloc.2 IL_000f: ceq IL_0011: ldc.i4.0 IL_0012: ceq IL_0014: stloc.3 IL_0015: ldloc.3 IL_0016: brtrue.s IL_001d IL_0018: nop IL_0019: ldc.i4.1 IL_001a: stloc.1 IL_001b: br.s IL_0040 IL_001d: ldloc.1 IL_001e: ldc.i4.0 IL_001f: ceq IL_0021: stloc.3 IL_0022: ldloc.3 IL_0023: brtrue.s IL_0032 IL_0025: nop IL_0026: ldstr "Yes" IL_002b: call void [mscorlib]System.Console::WriteLine(string) IL_0030: nop IL_0031: nop IL_0032: nop IL_0033: ldloc.2 IL_0034: ldc.i4.1 IL_0035: add IL_0036: stloc.2 IL_0037: ldloc.2 IL_0038: ldc.i4.s 20 IL_003a: clt IL_003c: stloc.3 IL_003d: ldloc.3 IL_003e: brtrue.s IL_000c IL_0040: nop IL_0041: ldloc.0 IL_0042: ldc.i4.1 IL_0043: add IL_0044: stloc.0 IL_0045: ldloc.0 IL_0046: ldc.i4.s 10 IL_0048: clt IL_004a: stloc.3 IL_004b: ldloc.3 IL_004c: brtrue.s IL_0005 IL_004e: ret } // end of method Test::DeclareInside </code></pre> <p>The only differences are where the variables are located within the stack.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload