When going over the project source code, I stumbled upon a method and wondered about one thing. Are the following two methods EXACTLY same from the performance/memory/compiler point of view?
public static string Foo(string inputVar)
{
    string bar = DoSomething(inputVar);
    return bar;
}
public static string Foo(string inputVar)
{
    return DoSomething(inputVar);
}
Is the return variable automatically created by compiler?
Using IL Disassembler (included in the .NET SDK/VS) you can look at the IL generated by the compiler. The code is generated using VS2013 (not Roslyn).
The top one gives the following IL:
.method public hidebysig static string  Foo(string inputVar) cil managed
{
  // Code size       14 (0xe)
  .maxstack  1
  .locals init ([0] string bar,
           [1] string CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  call       string TestIL.Program::DoSomething(string)
  IL_0007:  stloc.0
  IL_0008:  ldloc.0
  IL_0009:  stloc.1
  IL_000a:  br.s       IL_000c
  IL_000c:  ldloc.1
  IL_000d:  ret
} // end of method Program::Foo
The second one:
.method public hidebysig static string  Foo(string inputVar) cil managed
{
  // Code size       12 (0xc)
  .maxstack  1
  .locals init ([0] string CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  call       string TestIL.Program::DoSomething(string)
  IL_0007:  stloc.0
  IL_0008:  br.s       IL_000a
  IL_000a:  ldloc.0
  IL_000b:  ret
} // end of method Program::Foo
The difference seems to be that the first one creates an extra entry in the methods locals table. If this is optimized away by the JIT compiler I don't know.
To answer the question: No, it doesn't seems that the compiler automatically generates a local variable in this case, but in more advanced case it might do (like return x * (y + z)).
Edit: If you turn on "Optimize code" its even more clear:
.method public hidebysig static string  Foo(string inputVar) cil managed
{
  // Code size       9 (0x9)
  .maxstack  1
  .locals init ([0] string bar)
  IL_0000:  ldarg.0
  IL_0001:  call       string TestIL.Program::DoSomething(string)
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  ret
} // end of method Program::Foo
.method public hidebysig static string  Foo(string inputVar) cil managed
{
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       string TestIL.Program::DoSomething(string)
  IL_0006:  ret
} // end of method Program::Foo
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With