Typumwandlungen in C#
Erlernen Sie Typumwandlungen in C#, einschließlich impliziter und expliziter Konvertierung sowie Parse-, TryParse- und Convert-Methoden.
Beim Programmieren arbeiten wir mit verschiedenen Datentypen. Benutzereingaben sind meistens vom Typ string,
aber um mathematische Operationen durchführen zu können, müssen diese Daten in numerische Typen umgewandelt werden.
An diesem Punkt kommen Datentypumwandlungen (type conversions) ins Spiel.
In diesem Artikel untersuchen wir die Methoden zur Typumwandlung in C#.
Implizites und explizites Casting
Die Umwandlung von einem kleineren Datentyp in einen größeren erfolgt automatisch als implizites Casting. Bei der Umwandlung von einem größeren Typ in einen kleineren besteht jedoch das Risiko eines Datenverlustes, daher muss ein explizites Casting verwendet werden.
// Implizites Casting
int zahl = 100;
long gross = zahl; // automatische Umwandlung
double komma = zahl; // int → double
// Explizites Casting
double d = 12.9;
int i = (int)d; // 12, Nachkommastellen gehen verloren
byte b = (byte)300; // 300 ist für byte zu groß → Überlauf
Console.WriteLine(b); // 44
Umwandlungen mit der Convert-Klasse
Die Convert-Klasse ermöglicht sichere Umwandlungen zwischen häufig verwendeten Typen.
string s1 = "42";
int zahl = Convert.ToInt32(s1);
string s2 = "3.14";
double pi = Convert.ToDouble(s2);
bool status = Convert.ToBoolean(1); // true
string text = Convert.ToString(12345);
Console.WriteLine(zahl);
Console.WriteLine(pi);
Console.WriteLine(status);
Console.WriteLine(text);
Parse- und TryParse-Methoden
Parse wirft bei ungültiger Eingabe eine Ausnahme, während TryParse false zurückgibt, wenn die Umwandlung fehlschlägt.
Parse-Beispiele:
int i = int.Parse("123");
double d = double.Parse("12.5");
decimal preis = decimal.Parse("99.99");
bool b = bool.Parse("true");
Console.WriteLine(i);
Console.WriteLine(d);
Console.WriteLine(preis);
Console.WriteLine(b);
TryParse-Beispiel:
Console.Write("Geben Sie eine Zahl ein: ");
string eingabe = Console.ReadLine();
if (int.TryParse(eingabe, out int ergebnis))
{
Console.WriteLine("Eingegebene Zahl: " + ergebnis);
}
else
{
Console.WriteLine("Ungültige Zahl eingegeben.");
}
Boxing und Unboxing
Das Einpacken von Werttypen in ein object nennt man boxing,
und das Zurückholen nennt man unboxing.
int x = 10;
// Boxing
object obj = x;
// Unboxing
int y = (int)obj;
Console.WriteLine(y);
// Falsches Unboxing löst einen Fehler aus
object obj2 = "Text";
// int z = (int)obj2; // InvalidCastException
Typprüfung und Umwandlungsoperatoren
Mit den Operatoren is, as sowie den Konstrukten GetType und typeof kann eine Typprüfung durchgeführt werden.
object daten = "Hallo";
// is-Operator
if (daten is string)
Console.WriteLine("Die Daten sind vom Typ string.");
// as-Operator
string str = daten as string;
if (str != null)
Console.WriteLine(str.ToUpper());
// GetType und typeof
Console.WriteLine(daten.GetType()); // System.String
Console.WriteLine(typeof(int)); // System.Int32
Beispielanwendung
Lesen wir Produktinformationen als Strings ein und wandeln sie in die passenden Typen um.
Console.Write("Produktname: ");
string produkt = Console.ReadLine();
Console.Write("Menge: ");
string mengeStr = Console.ReadLine();
Console.Write("Stückpreis: ");
string preisStr = Console.ReadLine();
Console.Write("Rabatt (%): ");
string rabattStr = Console.ReadLine();
Console.Write("Auf Lager? (Y/N): ");
string lagerStr = Console.ReadLine();
if (int.TryParse(mengeStr, out int menge) &&
decimal.TryParse(preisStr, out decimal preis) &&
double.TryParse(rabattStr, out double rabatt))
{
bool lager = lagerStr.Trim().ToUpper() == "Y";
decimal gesamt = menge * preis;
decimal rabattBetrag = gesamt * (decimal)(rabatt / 100);
decimal endBetrag = gesamt - rabattBetrag;
Console.WriteLine($"\nProdukt: {produkt}");
Console.WriteLine($"Menge: {menge}");
Console.WriteLine($"Stückpreis: {preis:0.00} EUR");
Console.WriteLine($"Rabatt: %{rabatt}");
Console.WriteLine($"Lager: {(lager ? "Verfügbar" : "Nicht verfügbar")}");
Console.WriteLine($"Gesamt: {endBetrag:0.00} EUR");
}
else
{
Console.WriteLine("Ungültige Eingabe.");
}