Dies sind nicht alle Beispiele für das Casting.
Dies ist ein Cast:
%Vor%Dies ist Methodenaufruf:
%Vor%Und das ist eine sichere Besetzung:
%Vor% Das erste und dritte Beispiel sind tatsächliche Umwandlungen. Der erste Cast hat das Potenzial, ein InvalidCastException
zu werfen, wohingegen das dritte Beispiel diese Ausnahme nicht auslöst. Aus diesem Grund ist der Operator as
als sicherer Cast bekannt.
Hier ist mein Artikel zu diesem Thema.
Was "am richtigsten" ist, ist derjenige, der die richtige Bedeutung hat, die Sie dem Leser des Programms vermitteln möchten.
"ToString ()" vermittelt "das ist wahrscheinlich keine Zeichenkette; wenn nicht, dann möchte ich von dem Objekt eine Zeichenkette erhalten, die es darstellt."
Der "cast" -Operator vermittelt entweder "das ist eine Zeichenkette, und ich bin bereit, mein Programm zum Absturz zu bringen, wenn ich falsch liege", oder das Gegenteil, "dies ist keine Zeichenkette und ich möchte eine benutzerdefinierte aufrufen Konvertierung für dieses Objekt in String ".
Der "as" -Operator vermittelt "dies könnte eine Zeichenfolge sein und wenn nicht, möchte ich, dass das Ergebnis null ist."
Welches dieser vier Dinge meinst du?
Die drei machen verschiedene Dinge - keiner ist "korrekter", es kommt auf Ihre Situation an. Wenn Sie mehrere Objekte haben, bei denen es sich möglicherweise nicht um Strings handelt, verwenden Sie wahrscheinlich .ToString () (mit einem Null-Check, wenn Sie Nullen erwarten).
Wenn Sie nur für die Nicht-Null-Zeichenfolgen interessiert sind, aber trotzdem keine Zeichenfolgen empfangen möchten, verwenden Sie eine "as" -Ausführung und ignorieren Sie dann die Werte, die als null (ursprünglich null oder von null) angezeigt werden ein Nicht-String-Typ)
Wenn Sie erwarten, nur Zeichenfolgen zu erhalten, verwenden Sie am besten die Zeichenfolgen. Dies drückt die Absicht am besten im Code aus.
%Vor%Das Schlüsselwort as ist sehr hilfreich, wenn Sie der Meinung sind, dass die Konvertierung während eines Upcasts fehlschlägt. Zum Beispiel, wenn ich dieselbe Operation für ähnliche Typen in einer Kontrollliste ausführen möchte ... nehmen wir an, alle Kontrollkästchen deaktiviert zu haben:
%Vor%Auf diese Weise wird, wenn meine Liste etwas anderes hat, wie ein Textfeld oder eine Beschriftung, keine Ausnahme ausgelöst (da die Variable einfach = null gesetzt wird, wenn sie fehlschlägt), und sie ist sehr effizient. Es gibt keinen Ausnahmeaufwand.
Die Ideen von CAST und CONVERT sollten hier nicht verwechselt werden. Beim Casting wird ein Objekt so angezeigt, als wäre es ein anderer Typ. Beim Konvertieren wird ein Objekt in einen anderen Typ umgewandelt.
Wenn Sie eine Zeichenfolge mit CAST verknüpfen möchten, sollten Sie die erste oder dritte verwenden. (Die Option hängt davon ab, was in der Fehlerbedingung passieren soll. Siehe bangoker 's Antwort.)
Wenn Sie eine Zeichenfolge konvertieren möchten, sollten Sie die zweite verwenden. (Oder besser, ChaosPandion 's modifizierte Anweisung mit dem trinary-Operator. Das liegt daran, dass das Verhalten der ToString
-Methode so definiert ist, dass das Objekt in eine String-Repräsentation umgewandelt wird.
Dies ist 100% persönliche Vorliebe hier, aber ich benutze das folgende:
%Vor%Bei der Konvertierung in einen Kind- oder Elterntyp (z. B. NetworkStream-- & gt; Stream)
%Vor%Bei der Konvertierung in einen neuen Typ (int - & gt; string)
Und ich benutze nie die letztere (als String) Methode, hauptsächlich weil ich von einem C / C ++ Hintergrund bevorzuge () und es etwas prägnanter ist.
Es gibt einen großen Unterschied zwischen Casting mit Klammern und Casting mit "as".
Grundsätzlich wird in Klammern eine Ausnahme ausgelöst, während "as" null zurückgibt, anstatt eine Ausnahme auszulösen.
Weitere Informationen hier
Das ist dein gutes altes normales Casting und es wird eine Ausnahme geworfen, wenn du versuchst, etwas in etwas zu werfen, das NICHT gecastet werden kann (also musst du manchmal prüfen, ob es castable ist)
%Vor%wirft nicht wirklich, es führt eine Methode aus, die von verschiedenen Stellen kommen kann (Schnittstellen), aber ALLE Objekte in C # haben, da sie vom Object-Objekt erben, das es hat. Es hat eine Standardoperation, die den Namen des Objekttyps angibt, aber Sie können es überladen, um zu drucken, was auch immer Ihre Klasse in der ToString-Methode drucken soll.
%Vor% Dies ist ein neues c # -Casting, es prüft zuerst, ob es castbar ist, indem es variable is string
zuerst verwendet und dann das Casting durchführt, wenn es gültig ist, oder Null zurückgibt, wenn es nicht ist. Es könnte also ein stiller Fehler sein Sie erwarten Ausnahmen, da Sie gegen Null überprüfen sollten.
Grundsätzlich
%Vor%ist dasselbe wie:
%Vor%außer, dass in einem Schritt und nicht in 2 geprüft und gecastet wird.
Zunächst sollten Sie Casting vermeiden mit AS-Betreiber . Der verlinkte Artikel erklärt warum.
Zweitens können Sie nur den AS-Operator verwenden, wenn Sie erwarten, dass der Wert auch nicht vom Typ ist, den Sie übergeben haben. Also müssen Sie das manuell überprüfen.
Auch der Methodenaufruf obj.ToString()
ist kein Casting, er konvertiert das Objekt in eine string -Darstellung (was im Fall einer Zeichenfolge selbst dieselbe Zeichenfolge ist). Dies kann von jeder Klasse überwacht werden.
Als allgemeine Regel folge ich dem:
(Type)
casting. as
nur, wenn das Objekt von einem anderen Typ sein kann als dem, in den Sie es umgewandelt haben. as
operator - IMMER das Ergebnis auf NULL prüfen. ToString
nur in Fällen, in denen Sie Informationen zum Objekt anzeigen müssen. Wenn Sie sich fragen, welche Syntax am besten geeignet ist, um eine Variable zu transformieren, dann bevorzuge ich die nächste:
%Vor%Natürlich können Sie someVariableDefaultValue anstelle von string.Empty verwenden.
Falls Sie nicht in einen String, sondern in einen komplexen Typ umwandeln, dann empfehle ich die nächste Syntax, die manchmal als sicherer Navigationsoperator bezeichnet wird:
%Vor%Tags und Links c#