Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Purpose of String.Concat(Object) instead of String.Concat(String)

What is the purpose of using String.Concat(Object) instead of String.Concat(String) in C#? Why just not use an implicit call of Object.ToString() instead of passing an object itself that may also cause boxing to happen?

Int32 i = 5;
String s = "i = ";

// Boxing happens, ToString() is called inside
Console.WriteLine(s + i);
// Why compiler doesn't call ToString() implicitly?
Console.WriteLine(s + i.ToString());

Gives us the following IL.

.method private hidebysig static void  MyDemo() cil managed
{
    // Code size       47 (0x2f)
    .maxstack  2
    .locals init ([0] int32 i, [1] string s)
    IL_0000:  nop
    IL_0001:  ldc.i4.5
    IL_0002:  stloc.0
    IL_0003:  ldstr      "i = "
    IL_0008:  stloc.1
    IL_0009:  ldloc.1
    IL_000a:  ldloc.0
    IL_000b:  box        [mscorlib]System.Int32
    IL_0010:  call       string [mscorlib]System.String::Concat(object, object)
    IL_0015:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_001a:  nop
    IL_001b:  ldloc.1
    IL_001c:  ldloca.s   i
    IL_001e:  call       instance string [mscorlib]System.Int32::ToString()
    IL_0023:  call       string [mscorlib]System.String::Concat(string, string)
    IL_0028:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_002d:  nop
    IL_002e:  ret
} // end of method Program::MyDemo
like image 493
John Doe Avatar asked Jul 31 '15 07:07

John Doe


1 Answers

Why should the compiler do that? It can't.

If you pass in an object (in this case a boxed int), the only possibility for the compiler is to call string.Concat(object, object). It can't call string.Concat(string, string) since not both of the parameters are a string and thus complies to the second overload.

Instead, it calls string.Concat(object, object) and does a ToString inside if applicable.

You as a developer have intimate knowledge of how the string.Concat method works. The compiler doesn't know that eventually it all becomes a string.

Also, what would happen if one of the objects is null? The ToString will fail with an exception. This doesn't make sense. Just pass in the object and let the code handle it.

like image 196
Patrick Hofman Avatar answered Oct 13 '22 18:10

Patrick Hofman