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 object
s 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