 <p>Ok, to answer your question the way you want it because you're being difficult. If you want a different answer, I highly suggest that you actually ask the question you want answered.</p> <p>I am compiling this code, first with only region 1 and then second with only region 2:</p> <pre><code>int var_a = 0; //... //Some code that fetches var_a from db if db field is not null //... // region 1 if(var_a != null &amp;&amp; var_a &gt; 0) var_a = -1; //region 2 if(var_a != null){ if (var_a &gt; 0) var_a = -1; } </code></pre> <p>If I extract the IL code for region 1, I get this:</p> <pre><code>IL_0015: nop IL_0016: ldc.i4.0 IL_0017: stloc.0 IL_0018: ldloc.0 IL_0019: ldc.i4.0 IL_001a: cgt IL_001c: ldc.i4.0 IL_001d: ceq IL_001f: stloc.1 IL_0020: ldloc.1 IL_0021: brtrue.s IL_0025 IL_0023: ldc.i4.m1 IL_0024: stloc.0 IL_0025: ldloc.0 </code></pre> <p>And for region 2, I get this:</p> <pre><code>IL_0015: nop IL_0016: ldc.i4.0 IL_0017: stloc.0 IL_0018: ldc.i4.1 IL_0019: ldc.i4.0 IL_001a: ceq IL_001c: stloc.1 IL_001d: nop IL_001e: ldloc.0 IL_001f: ldc.i4.0 IL_0020: cgt IL_0022: ldc.i4.0 IL_0023: ceq IL_0025: stloc.1 IL_0026: ldloc.1 IL_0027: brtrue.s IL_002b IL_0029: ldc.i4.m1 IL_002a: stloc.0 IL_002b: nop IL_002c: ldloc.0 </code></pre> <p>So, yes, there is a slightly difference. JetBrains DotPeek shows a difference.</p> <p>Region 1:</p> <pre><code>if (num &gt; 0) num = -1; </code></pre> <p>Region 2:</p> <pre><code>int num = 0; bool flag = 1 == 0; if (num &gt; 0) num = -1; </code></pre> <p>Whereas JustDecompile cleans things up a bit and shows the same IL->C# conversion for both:</p> <pre><code>if (var_a &gt; 0) { var_a = -1; } </code></pre> <p>Since you care so much about efficiency, I've written a quick bit of code to try and benchmark the difference:</p> <pre><code>Random rn = new Random(); List&lt;int&gt; l = new List&lt;int&gt;(); System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); for (int j = 1; j &lt;= 20; ++j) { l.Clear(); sw.Start(); if (j % 2 == 0) { Console.Write("A: "); for (int i = 0; i &lt; 100000000; ++i) { int var_a = rn.Next(1, 10000) * (rn.NextDouble() &lt;= 0.5 ? -1 : 1); if (var_a != null) if (var_a &gt; 0) var_a *= -1; l.Add(var_a); } } else { Console.Write("B: "); for (int i = 0; i &lt; 100000000; ++i) { int var_a = rn.Next(1, 10000) * (rn.NextDouble() &lt;= 0.5 ? -1 : 1); if (var_a != null &amp;&amp; var_a &gt; 0) var_a *= -1; l.Add(var_a); } } sw.Stop(); Console.WriteLine(sw.Elapsed.TotalMilliseconds); sw.Reset(); } </code></pre> <p>Values for A:</p> <pre><code>2918.6503 2910.8609 2916.2404 2909.5394 2914.0309 2961.0775 2948.4139 2957.1939 2962.1737 </code></pre> <p>Values for B:</p> <pre><code>3170.8064 2891.6971 2924.8533 2890.6248 2885.1991 2890.6321 2887.0145 2935.6778 2909.035 </code></pre> <p>The average for the entire 100,000,000 execution cycle for A vs B is <code>2933 ms</code> vs <code>2932 ms</code> respectively.</p> <p>Per execution of the internal block, that's <code>2.9331 * 10^-5</code> vs <code>2.9317 * 10^-5</code>.</p> <p>Now we've got down to this, I have to ask why you would be writing a program in as high a level language as C# when you care about something that makes <code>0.000000014045333333 ms</code> difference between one way and the other. Perhaps you should try something more low level like Assembly? All in all, this discrepancy could still come down to activity of the CPU during that operation doing other things for Windows.</p> <p>I hope this answer goes into the depth you've come to expect from StackOverflow.</p>