Welche Variante gefällt Ihnen besser:
// A: Console.WriteLine("Zahlen: {0}, {1}, {2}", 10, 20, 30); // B: Console.WriteLine("Zahlen: {0}, {1}, {2}", 10.ToString(), 20.ToString(), 30.ToString());
Instinktiv werden die meisten erst einmal Variante a bevorzugen. 10.ToString() sieht einfach komisch aus. Dafür gibt es auch noch nicht einmal Unterstützung durch IntelliSense.
Aber schauen wir uns mal Variante A genauer an:
Die Zahlen sind Integer-Werte (und Integer-Werte sind Value-Typen!). Die Methode Console.WriteLine() hat aber keine Überladung, die Integer-Werte übernimmt. Sie übernimmt nur Paramter vom Typ System.Object. Wenn ein Wertetyp als Object verwendet wird, stellt der JIT-Compiler auf dem Heap eine Box in die eine Kopie des Objektes gelegt wird. Jeder Zugriff auf das Objekt erfolgt über eine Kopie aus der “Box”. Dieser Prozess nennt sich boxing und unboxing und ist leider aufwendig. Was passiert ist quasi folgendes:
int i = 10; object obj = i; // boxing SomeMethod(obj); void SomeMethod(object obj) { int i = (int)obj; // unboxing Console.WriteLine("...", i.ToString()); }
So Code würde natürlich niemand schreiben! Deshalb ist es wichtig darauf zu achten, wann Wertetypen als Object übergeben werden. Variante b wäre also in diesem Fall vorzuziehen.