Fortgeschrittene Grundlagen: Konvertierungen

Konvertierungen werden benötigt, um den Wert eines Datentyps in einen Wert eines anderen Datentyps umzuwandeln. Für den Benutzer handelt es sich dabei oft um den gleichen Wert. Dies ist jedoch in der Programmierung nicht immer der Fall. Ein Beispiel dazu: "15" ist nicht das Gleiche wie 15. Bei dem ersten Wert handelt es sich um den Datentyp string und bei dem zweiten Wert um den Datentyp int.
Einige Werte können direkt in einen anderen Datentyp konvertiert werden. Hier spricht man auch von Typumwandlungen. Hierbei unterscheidet man zwischen der impliziten Typumwandlung und der expliziten Typumwandlung. Die implizite Typumwandlung führt der Compiler automatisch aus. Diese Umwandlung erfolgt z. B. bei der Zuweisung einer int-Variablen auf eine long-Variable. Diese „automatische“ Umwandlung ist möglich, da keine Daten dabei verloren gehen. Die explizite Typumwandlung muss durch den Programmierer im Programmcode ausgelöst werden. Hierfür ist der sogenannte cast notwendig. Beim cast werden vor dem zuzuweisenden Wert runde Klammern notiert, in welche der Ziel-Datentyp eingetragen wird. Eine solche Konvertierung ist z. B. notwendig, wenn wir den Wert einer double-Variable in eine Ganzzahl-Variable (z. B. vom Datentyp int) zuweisen wollen, da hierbei Informationen verloren gehen (in diesem Fall der Gleitkomma-Anteil).
Wenn wir nun bspw. eine Zeichenkette in eine Zahl umwandeln möchten, reichen die oben beschriebenen Typ-Umwandlungen jedoch nicht aus. Dies liegt daran, da eine Zeichenkette sozusagen eine spezielle Art von Array ist. Des Weiteren entspricht ein einzelnes Zeichen (char) nicht der (für den Menschen sichtbaren) Zahl selbst, sondern der dazugehörigen ASCII- / Unicode-Zahl ('0' != 0, sondern '0' == 48). Für solche Konvertierungen gibt es die statische Klasse Convert (Namensraum System). Diese Klasse besitzt einige Funktionen, welche mehrfach überladen sind. Als Beispiel zu nennen sind ConvertToInt32() und ConvertToDouble(). Natürlich existieren auch Konvertierungs-Funktionen für die anderen Datentypen. Im ersten Moment erscheint der Funktionsname ConvertToInt32() etwas verwirrend. Die 32 im Funktionsname entspricht der Anzahl der Bits des dazugehörigen Ganzzahl-Typs (in diesem Fall also int). Für short gibt es damit also die Funktion ConvertToInt16(), für long die Funktion ConvertToInt64(), für uint die Funktion ConvertToUInt32() usw. Das „Problem“ mit diesen Funktionen ist, dass eine Exception (dazu später mehr) ausgelöst wird, wenn der übergebene Wert ungültig ist. Wird eine solche Exception im Programmcode nicht abgefangen, stürzt das Programm ab.
Eine elegantere Variante ist die TryParse()-Funktion, die immer dann eingesetzt werden kann, wenn eine Zeichenkette in einen anderen Datentyp umgewandelt werden soll. Die TryParse()-Funktion befindet sich in der Klasse des jeweiligen Datentyps (für den Datentyp int also int.TryParse()). TryParse() erwartet als 1. Parameter eine Zeichenkette und als 2. Parameter eine Referenz (out-Schlüsselwort, dazu später mehr) auf eine Variable des jeweiligen Datentyps. Die Rückgabe der TryParse() ist ein bool-Wert. Ist die Konvertierung erfolgreich, wird der konvertierte Wert in der referenzierten Variable (2. Parameter) gespeichert und true zurückgegeben. Bei fehlerhafter Konvertierung wird der Wert auf 0 gesetzt und false zurückgegeben.

Program.cs

int iZahl1, iZahl2;

// falls bei den ersten zwei Eingaben, etwas ungültiges eingegeben wird, wird eine Exception ausgelöst
Console.Write("Bitte geben Sie die erste Zahl ein: ");
iZahl1 = Convert.ToInt32(Console.ReadLine());
Console.Write("Bitte geben Sie die zweite Zahl ein: ");
iZahl2 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Das Ergebnis von {0} + {1} ist {2}", iZahl1, iZahl2, iZahl1 + iZahl2);

Console.WriteLine();

// falls bei den nächsten zwei Eingaben, etwas ungültiges eingegeben wird, wird eine Fehlermeldung ausgegeben
Console.Write("Bitte geben Sie die erste Zahl ein: ");
if (!int.TryParse(Console.ReadLine(), out iZahl1))
	Console.WriteLine("Die eingegebene Zahl war ungültig. iZahl1 wurde automatisch auf 0 gesetzt!");
Console.Write("Bitte geben Sie die zweite Zahl ein: ");
if (!int.TryParse(Console.ReadLine(), out iZahl2))
	Console.WriteLine("Die eingegebene Zahl war ungültig. iZahl2 wurde automatisch auf 0 gesetzt!");
Console.WriteLine("Das Ergebnis von {0} + {1} ist {2}", iZahl1, iZahl2, iZahl1 + iZahl2);

Console.ReadKey();
Download

LinksRechts