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
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.
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