Boxing and Unboxing

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.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s