Übung: Erkunden der Umwandlung und Konvertierung von Datentypen
- 30 Minuten
Es gibt mehrere Verfahren zum Durchführen einer Datentypkonvertierung. Welche Methode Sie auswählen, hängt von Ihrer Antwort auf zwei wichtige Fragen ab:
- Ist es abhängig vom Wert möglich, dass der Versuch, den Datentyp des Werts zu ändern, zur Laufzeit eine Ausnahme auslöst?
- Ist es abhängig vom Wert möglich, dass der Versuch, den Datentyp des Werts zu ändern, zu einem Verlust von Informationen führt?
In dieser Übung befassen Sie sich mit diesen Fragen, den Auswirkungen ihrer Antworten und der Technik, die Sie verwenden sollten, wenn Sie den Datentyp ändern müssen.
Vorbereiten Ihrer Programmierumgebung
Dieses Modul enthält praktische Aktivitäten, die Sie durch den Prozess der Erstellung und Ausführung von Demonstrationscode führen. Es wird empfohlen, diese Aktivitäten mit Visual Studio Code als Entwicklungsumgebung durchzuführen. Die Verwendung von Visual Studio Code für diese Aktivitäten vereinfacht das Schreiben und Ausführen von Code in einer Entwicklerumgebung, die von Expert*innen weltweit verwendet wird.
Hinweis
Wenn Sie schon andere Microsoft Learn-Module in dieser C#-Reihe abgeschlossen haben, haben Sie möglicherweise bereits einen Projektordner für Codebeispiele erstellt. In diesem Fall können Sie den folgenden Abschnitt überspringen und den Code in der Datei Program.cs aus der vorherigen Übung löschen.
Hinweis
Die Codebeispiele in dieser Übung basieren auf den Einstellungen für die Kultur „en-US“ und verwenden einen Punkt (.) als Dezimaltrennzeichen. Das Erstellen und Ausführen des Codes mit einer Kultureinstellung, die ein anderes Dezimaltrennzeichen verwendet (z. B. ein Komma ,), kann zu unerwarteten Ergebnissen oder Fehlern führen. Um dieses Problem zu beheben, ersetzen Sie die Punkt-Dezimaltrennzeichen in den Codebeispielen durch das lokale Dezimaltrennzeichen (z. B. ,).
Wenn Sie alternativ ein Programm mit der Kultureinstellung „en-US“ ausführen möchten, fügen Sie den folgenden Code am Anfang des Programms hinzu: using System.Globalization;, und nach allen weiteren using-Anweisungen fügen Sie CultureInfo.CurrentCulture = new CultureInfo("en-US"); hinzu.
Öffnen Sie Visual Studio Code.
Sie können das Windows-Startmenü (oder eine entsprechende Ressource für ein anderes Betriebssystem) verwenden, um Visual Studio Code zu öffnen.
Wählen Sie im Menü "Visual Studio Code-Datei " die Option "Ordner öffnen" aus.
Navigieren Sie im Dialogfeld "Ordner öffnen " zum Windows-Desktopordner.
Wenn Sie Codeprojekte an einem anderen Ort speichern, können Sie stattdessen diesen Ordnerspeicherort verwenden. Für dieses Training ist es wichtig, einen Ort zu haben, den Sie leicht finden und sich gut merken können.
Wählen Sie im Dialogfeld "Ordner öffnen " die Option "Ordner auswählen" aus.
Wenn ein Sicherheitsdialogfeld angezeigt wird, in dem Sie gefragt werden, ob Sie den Autoren vertrauen, wählen Sie "Ja" aus.
Wählen Sie im Menü "Visual Studio Code Terminal " die Option "Neues Terminal" aus.
Beachten Sie, dass eine Eingabeaufforderung im Panel „Terminal“ den Ordnerpfad für den aktuellen Ordner anzeigt. Beispiel:
C:\Users\someuser\Desktop>Um eine neue Konsolenanwendung in einem angegebenen Ordner zu erstellen, geben Sie an der Terminaleingabeaufforderung
dotnet new console -o ./CsharpProjects/TestProjectein, und drücken Sie dann die EINGABETASTE.Dieser .NET-CLI-Befehl verwendet eine .NET-Programmvorlage, um ein neues C#-Konsolenanwendungsprojekt am angegebenen Ordnerspeicherort zu erstellen. Der Befehl erstellt die Ordner „CsharpProjects“ und „TestProject“ für Sie und verwendet „TestProject“ als Namen für die
.csproj-Datei.Erweitern Sie im EXPLORER-Bereich den Ordner "CsharpProjects ".
Nun sollten der TestProject-Ordner und zwei Dateien (eine C#-Programmdatei namens „Program.cs“ und eine C#-Projektdatei namens „TestProject.csproj“) angezeigt werden.
Wählen Sie im EXPLORER-Bereich Program.cs aus, um Ihre Codedatei im Editorbereich anzuzeigen.
Löschen Sie die vorhandenen Codezeilen.
Sie verwenden dieses C#-Konsolenprojekt zum Erstellen und Ausführen von Codebeispielen im Rahmen dieses Moduls.
Schließen Sie das Panel „Terminal“.
Frage: Ist es möglich, dass der Versuch, den Datentyp des Werts zu ändern, zur Laufzeit eine Ausnahme auslöst?
Der C#-Compiler versucht, Ihren Code einzubinden, kompiliert aber keine Vorgänge, die zu einer Ausnahme führen könnten. Wenn Sie das Hauptanliegen des C#-Compilers verstehen, ist es einfacher nachzuvollziehen, warum er auf eine bestimmte Weise funktioniert.
Schreiben von Code, der versucht, einen int- und einen string-Wert hinzuzufügen und das Ergebnis in einem int-Wert zu speichern
Stellen Sie sicher, dass Visual Studio Code geöffnet ist und „Program.cs“ im Editor-Bereich angezeigt wird.
Hinweis
„Program.cs“ sollte leer sein. Wenn dies nicht der Fall ist, wählen Sie alle Codezeilen aus, und löschen Sie sie.
Geben Sie den folgenden Code in den Visual Studio Code-Editor ein:
int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);Hier versuchen Sie, die Werte
2und4hinzuzufügen. Der Wert4ist vom Typstring. Funktioniert das?Wählen Sie im Menü "Visual Studio Code-Datei " die Option "Speichern" aus.
Die Datei „Program.cs“ muss vor dem Erstellen oder Ausführen des Codes gespeichert werden.
Klicken Sie im EXPLORER-Bereich auf "TestProject", um ein Terminal am Speicherort des TestProject-Ordners zu öffnen, klicken Sie mit der rechten Maustaste auf "TestProject", und wählen Sie dann "In integriertem Terminal öffnen" aus.
Es sollte sich ein Terminalbereich mit einer Eingabeaufforderung öffnen, die anzeigt, dass das Terminal für den Speicherort Ihres TestProject-Ordners geöffnet ist.
Geben Sie in der Eingabeaufforderung des Terminals
dotnet runein, um Ihren Code auszuführen, und drücken Sie dann die EINGABETASTE.Es sollte die folgende Ausgabe angezeigt werden.
C:\Users\someuser\Desktop\csharpprojects\TestProject\Program.cs(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'Hinweis
Wenn die Meldung „Es wurde kein ausführbares Projekt gefunden“ angezeigt wird, stellen Sie sicher, dass in der Eingabeaufforderung des Terminals der erwartete Speicherort des Ordners „TestProject“ angezeigt wird. Beispiel:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Nehmen Sie sich eine Minute Zeit, um zu überlegen, warum der Compiler das erste Codebeispiel nicht ausführen konnte.
Der wichtige Teil der Fehlermeldung,
(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int', besagt, dass das Problem bei der Verwendung des Datentypsstringliegt.Aber warum kann der C#-Compiler diesen Fehler nicht einfach behandeln? Schließlich ist das Gegenteil möglich, um eine Zahl mit einem
string-Wert zu verketten und in einer Zeichenfolgenvariable zu speichern. Hier ändern Sie den Datentyp der Variablenresultausintinstring.Aktualisieren Sie Ihren Code im Visual Studio Code-Editor wie folgt:
int first = 2; string second = "4"; string result = first + second; Console.WriteLine(result);Speichern Sie Ihre Codedatei, und führen Sie Ihren Code dann mit Visual Studio Code aus.
Sie sollten dann die folgende Ausgabe sehen:
24Die Ausgabe ist mathematisch falsch, wird aber vervollständigt, indem die Werte als die Zeichen „2“ und „4“ kombiniert werden.
Untersuchen Sie noch einmal das erste Codebeispiel, bei dem die
result-Variable den Typinthat. Hier sehen Sie den Code mit der Fehlermeldung:int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);Warum kann der C#-Compiler nicht herausfinden, dass die Variable
second, die4enthält, als Zahl behandelt werden soll und nicht alsstring?
Compiler sorgen für sichere Konvertierungen
Der C# Compiler sieht ein mögliches Problem in der Umsetzung. Die Variable second ist vom Typ string. Daher wird sie möglicherweise auf einen anderen Wert wie "hello" festgelegt. Wenn der C#-Compiler versuchen würde, "hello" in eine Zahl zu konvertieren, würde dies zur Laufzeit eine Ausnahme verursachen. Um diese Möglichkeit zu vermeiden, führt der C#-Compiler keine implizite Konvertierung von string in int für Sie durch.
Aus der Sicht des C#-Compilers wäre der sicherere Vorgang, int in einen string-Wert zu konvertieren und stattdessen eine Verkettung durchzuführen.
Wenn Sie eine Addition mit einer Zeichenfolge durchführen möchten, erfordert der C#-Compiler, dass Sie die Datenkonvertierung expliziter steuern. Dies bedeutet, dass Sie stärker einbezogen werden, damit Sie die richtigen Vorkehrungen treffen können, um die Möglichkeit zu berücksichtigen, dass die Konvertierung eine Ausnahme auslösen könnte.
Wenn Sie einen Wert vom ursprünglichen Datentyp in einen neuen Datentyp ändern müssen und die Änderung zur Laufzeit eine Ausnahme erzeugen kann, müssen Sie eine Datenkonvertierung durchführen.
Zum Ausführen einer Datenkonvertierung können Sie eine der folgenden Methoden verwenden:
- Verwenden einer Hilfsmethode für den Datentyp
- Verwenden einer Hilfsmethode für die Variable
- Verwenden der Methoden der
Convert-Klasse
Sie sehen sich später in dieser Einheit einige Beispiele dieser Techniken für die Datenkonvertierung an.
Frage: Ist es möglich, dass der Versuch, den Datentyp des Werts zu ändern, zu einem Verlust von Informationen führt?
Löschen oder verwenden Sie den Zeilenkommentaroperator
//, um den Code aus dem vorherigen Übungsschritt auszukommentieren, und fügen Sie den folgenden Code hinzu:int myInt = 3; Console.WriteLine($"int: {myInt}"); decimal myDecimal = myInt; Console.WriteLine($"decimal: {myDecimal}");Speichern Sie Ihre Codedatei, und führen Sie Ihren Code dann mit Visual Studio Code aus.
Die folgende Ausgabe sollte angezeigt werden:
int: 3 decimal: 3Der Schlüssel für dieses Beispiel ist die folgende Codezeile:
decimal myDecimal = myInt;Da jeder
int-Wert problemlos in einen Wert vom Typdecimalpasst, führt der Compiler die Konvertierung aus.Der Begriff "Erweiterungskonvertierung " bedeutet, dass Sie versuchen, einen Wert aus einem Datentyp zu konvertieren, der weniger Informationen in einen Datentyp enthalten kann, der weitere Informationen enthalten kann. In diesem Fall verliert ein Wert, der in einer Variablen vom Typ
intgespeichert ist und in eine Variable vom Typdecimalumgewandelt wird, keine Informationen.Wenn Sie wissen, dass Sie eine Erweiterungskonvertierung durchführen, können Sie sich auf die implizite Konvertierung verlassen. Der Compiler verarbeitet implizite Konvertierungen.
Durchführen einer Umwandlung
Löschen oder verwenden Sie den Zeilenkommentaroperator
//, um den Code aus dem vorherigen Übungsschritt auszukommentieren, und fügen Sie den folgenden Code hinzu:decimal myDecimal = 3.14m; Console.WriteLine($"decimal: {myDecimal}"); int myInt = (int)myDecimal; Console.WriteLine($"int: {myInt}");Um eine Umwandlung auszuführen, verwenden Sie den Typumwandlungsoperator
()zum Umschließen eines Datentyps. Platzieren Sie ihn dann neben der Variablen, die Sie konvertieren möchten. (Beispiel:(int)myDecimal) Sie führen eine explizite Konvertierung in den definierten Datentyp (int) aus.Speichern Sie Ihre Codedatei, und führen Sie Ihren Code dann mit Visual Studio Code aus.
Die folgende Ausgabe sollte angezeigt werden:
decimal: 3.14 int: 3Der Schlüssel für dieses Beispiel ist die folgende Codezeile:
int myInt = (int)myDecimal;Die Variable
myDecimalenthält einen Wert, der nach dem Dezimalpunkt genau angegeben ist. Durch Hinzufügen der Umwandlungsanweisung(int)teilen Sie dem C#-Compiler mit, dass es möglich ist, dass Genauigkeit verloren geht, dass dies aber unter den vorliegenden Umständen unproblematisch ist. Sie sagen dem Compiler, dass Sie eine beabsichtigte Konvertierung durchführen, eine explizite Konvertierung.
Bestimmen, ob eine Konvertierung eine „erweiternde Konvertierung“ oder eine „einschränkende Konvertierung“ ist
Der Begriff "Schmalungskonvertierung " bedeutet, dass Sie versuchen, einen Wert aus einem Datentyp zu konvertieren, der weitere Informationen in einen Datentyp aufnehmen kann, der weniger Informationen enthalten kann. In diesem Fall verlieren Sie möglicherweise Informationen wie z.B. Genauigkeit (also die Anzahl der Werte nach dem Dezimaltrennzeichen). Ein Beispiel hierfür ist die Konvertierung eines in einer Variablen vom Typ decimal gespeicherten Wertes in eine Variable vom Typ int. Wenn Sie die beiden Werte ausgeben, würden Sie wahrscheinlich den Verlust von Informationen feststellen.
Wenn Sie wissen, dass Sie eine einschränkende Konvertierung durchführen, müssen Sie eine Typumwandlung ausführen. Bei der Umwandlung erhält der C#-Compiler eine Anweisung, die besagt, dass Sie sich der Genauigkeitseinbußen bewusst sind und diese akzeptieren.
Wenn Sie nicht sicher sind, ob bei der Konvertierung Daten verloren gehen, schreiben Sie Code, mit dem die Konvertierung auf zwei verschiedene Arten durchgeführt wird, und beobachten Sie dann die Änderungen. Entwickler*innen schreiben häufig kleine Tests, um das Verhalten besser zu verstehen, wie im nächsten Beispiel veranschaulicht.
Löschen oder verwenden Sie den Zeilenkommentaroperator
//, um den Code aus dem vorherigen Übungsschritt auszukommentieren, und fügen Sie den folgenden Code hinzu:decimal myDecimal = 1.23456789m; float myFloat = (float)myDecimal; Console.WriteLine($"Decimal: {myDecimal}"); Console.WriteLine($"Float : {myFloat}");Speichern Sie Ihre Codedatei, und führen Sie Ihren Code dann mit Visual Studio Code aus.
Die Ausgabe sollte etwa der folgenden entsprechen:
Decimal: 1.23456789 Float : 1.2345679Aus diesem Beispiel wird ersichtlich, dass es sich bei der Umwandlung eines
decimal-Werts in einenfloat-Wert um eine einschränkende Konvertierung handelt, weil Genauigkeit verloren geht.
Ausführen von Datenkonvertierungen
Zuvor wurde darauf hingewiesen, dass eine Wertänderung von einem Datentyp in einen anderen eine Laufzeitausnahme verursachen kann und Sie eine Datenkonvertierung durchführen sollten. Für Datenkonvertierungen gibt es drei Techniken, die Sie verwenden können:
- Verwenden einer Hilfsmethode für die Variable
- Verwenden einer Hilfsmethode für den Datentyp
- Verwenden der Methoden der
Convert-Klasse
Verwenden Sie ToString(), um eine Zahl in eine string umzuwandeln.
Jede Datentypvariable verfügt über eine ToString()-Methode. Was die ToString()-Methode genau leistet, hängt davon ab, wie sie für einen bestimmten Typ implementiert wird. Für die meisten primitiven Typen führt sie jedoch eine erweiternde Konvertierung durch. Obwohl dies nicht unbedingt erforderlich ist (da Sie sich in den meisten Fällen auf implizite Konvertierung verlassen können), kann diese Vorgehensweise anderen Entwickler*innen mitteilen, dass Sie verstehen, was Sie machen und dass es beabsichtigt ist.
Im Folgenden finden Sie ein kurzes Beispiel für die Verwendung der ToString()-Methode, um int-Werte explizit in string-Werte zu konvertieren.
Löschen oder verwenden Sie den Zeilenkommentaroperator
//, um den Code aus dem vorherigen Übungsschritt auszukommentieren, und fügen Sie den folgenden Code hinzu:int first = 5; int second = 7; string message = first.ToString() + second.ToString(); Console.WriteLine(message);Speichern Sie Ihre Codedatei, und führen Sie Ihren Code dann mit Visual Studio Code aus. Wenn Sie den Code ausführen, sollte die Ausgabe eine Verkettung der beiden Werte anzeigen:
57
Konvertieren einer string in einen int unter Verwendung der Parse()-Hilfsmethode
Die meisten numerischen Datentypen verfügen über eine Parse()-Methode, mit der eine Zeichenfolge in den angegebenen Datentyp konvertiert wird. In diesem Fall verwenden Sie die Parse()-Methode, um zwei Zeichenfolgen in int-Werte zu konvertieren und diese dann zusammen hinzuzufügen.
Löschen oder verwenden Sie den Zeilenkommentaroperator
//, um den Code aus dem vorherigen Übungsschritt auszukommentieren, und fügen Sie den folgenden Code hinzu:string first = "5"; string second = "7"; int sum = int.Parse(first) + int.Parse(second); Console.WriteLine(sum);Speichern Sie Ihre Codedatei, und führen Sie Ihren Code dann mit Visual Studio Code aus. Wenn Sie den Code ausführen, sollte die Ausgabe die Summe der beiden Werte anzeigen:
12Nehmen Sie sich eine Minute Zeit, und versuchen Sie, das mögliche Problem im vorherigen Codebeispiel zu erkennen. Was geschieht, wenn eine der Variablen
firstodersecondauf Werte festgelegt ist, die nicht in einenint-Wert konvertiert werden können? Zur Laufzeit wird eine Ausnahme ausgelöst. Der C#-Compiler und die Laufzeitumgebung erwarten, dass Sie vorausplanen und „unzulässige“ Konvertierungen verhindern. Sie können die Laufzeitausnahme auf verschiedene Weise beheben.Der einfachste Weg, diese Situation zu verbessern, ist die Verwendung von
TryParse(), einer besseren Version derParse()-Methode.
Konvertieren von string in ein int mithilfe der Convert-Klasse
Die Convert-Klasse verfügt über viele Hilfsmethoden, um einen Wert aus einem Typ in einen anderen zu konvertieren. Im folgenden Codebeispiel werden einige Zeichenfolgen in Werte vom Typ int konvertiert.
Löschen oder verwenden Sie den Zeilenkommentaroperator
//, um den Code aus dem vorherigen Übungsschritt auszukommentieren, und fügen Sie den folgenden Code hinzu:string value1 = "5"; string value2 = "7"; int result = Convert.ToInt32(value1) * Convert.ToInt32(value2); Console.WriteLine(result);Speichern Sie Ihre Codedatei, und führen Sie Ihren Code dann mit Visual Studio Code aus.
Die folgende Ausgabe sollte angezeigt werden:
35Hinweis
Warum lautet der Methodenname
ToInt32()? Warum nichtToInt()?System.Int32ist der Name des zugrunde liegenden Datentyps in der .NET-Klassenbibliothek, den die C#-Programmiersprache dem Schlüsselwortintzuordnet. Da dieConvert-Klasse auch Bestandteil der .NET-Klassenbibliothek ist, wird sie durch den vollständigen Namen und nicht durch ihren C#-Namen aufgerufen. Durch die Definition von Datentypen als Teil der .NET-Klassenbibliothek können mehrere .NET-Sprachen wie Visual Basic, F#, IronPython und andere dieselben Datentypen und dieselben Klassen in der .NET-Klassenbibliothek verwenden.Die Methode
ToInt32()verfügt über 19 überladene Versionen, die es ihr ermöglichen, praktisch jeden Datentyp zu akzeptieren.Sie haben hier die
Convert.ToInt32()-Methode mit einer Zeichenfolge verwendet, aber Sie sollten nach Möglichkeit wahrscheinlichTryParse()verwenden.Wann also sollte die
Convert-Klasse verwendet werden? DieConvert-Klasse eignet sich am besten zum Konvertieren von Bruchzahlen in ganze Zahlen (int), da sie erwartungsgemäß aufrundet.
Vergleich des Umwandelns und Konvertierens eines decimal in ein int
Das folgende Beispiel zeigt, was geschieht, wenn Sie versuchen, einen decimal-Wert in einen int-Wert (eine einschränkende Konvertierung) umzuwandeln, im Vergleich zur Verwendung der Convert.ToInt32()-Methode, um den gleichen decimal-Wert in einen int-Wert zu konvertieren.
Löschen oder verwenden Sie den Zeilenkommentaroperator
//, um den Code aus dem vorherigen Übungsschritt auszukommentieren, und fügen Sie den folgenden Code hinzu:int value = (int)1.5m; // casting truncates Console.WriteLine(value); int value2 = Convert.ToInt32(1.5m); // converting rounds up Console.WriteLine(value2);Speichern Sie Ihre Codedatei, und führen Sie Ihren Code dann mit Visual Studio Code aus.
Die folgende Ausgabe sollte angezeigt werden:
1 2
Abschneiden und Konvertieren von Rundungen
Wenn Sie int value = (int)1.5m; umwandeln, wird der Wert des float-Typs abgeschnitten, sodass das Ergebnis 1 lautet, was bedeutet, dass der Wert nach dem Komma vollständig ignoriert wird. Auch beim Ändern des Gleitkommas des Literals in 1.999m wäre das Ergebnis der Umwandlung identisch.
Bei der Konvertierung mit Convert.ToInt32() wird der literale float-Wert ordnungsgemäß auf 2 aufgerundet. Wenn der Literalwert in 1.499m geändert würde, wird er auf 1 abgerundet.
Zusammenfassung
Es wurden einige wichtige Konzepte der Datenkonvertierung und -umwandlung behandelt:
- Verhindern eines Laufzeitfehlers beim Ausführen einer Datenkonvertierung
- Ausführen einer expliziten Umwandlung, um dem Compiler mitzuteilen, dass Sie das Risiko des Verlusts von Daten verstehen
- Vertrauen auf den Compiler, um eine implizite Umwandlung durchzuführen, wenn eine erweiternde Konvertierung durchgeführt wird
- Verwenden des Umwandlungsoperators
()und des Datentyps, um eine Umwandlung auszuführen (z. B.(int)myDecimal) - Verwenden Sie die Klasse
Convert, wenn Informationen bei einer einschränkenden Konvertierung gerundet, nicht abgeschnitten werden sollen.