Was ist die beste Vorgehensweise für die Syntax beim Umwandeln einer Variablen?

7

Welche (wenn überhaupt) ist richtiger? Warum?

%Vor%

Ich habe alle drei benutzt, aber ich habe keine Vorliebe und verstehe nicht, warum einer besser ist als der andere.

    
Deane 12.01.2010, 21:37
quelle

10 Antworten

10

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.

    
Andrew Hare 12.01.2010, 21:41
quelle
6

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?

    
Eric Lippert 12.01.2010 23:15
quelle
5

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%     
Jimmy 12.01.2010 21:47
quelle
2

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.

    
Nick 12.01.2010 21:43
quelle
2

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.

    
jdmichal 12.01.2010 21:45
quelle
0

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.

    
Timothy Baldridge 12.01.2010 21:40
quelle
0

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

    
Padu Merloti 12.01.2010 21:44
quelle
0
%Vor%

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.

    
Francisco Noriega 12.01.2010 21:45
quelle
0

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:

  1. Verwenden Sie immer (Type) casting.
  2. Verwenden Sie den Operator as nur, wenn das Objekt von einem anderen Typ sein kann als dem, in den Sie es umgewandelt haben.
  3. Bei Verwendung von as operator - IMMER das Ergebnis auf NULL prüfen.
  4. Verwenden Sie ToString nur in Fällen, in denen Sie Informationen zum Objekt anzeigen müssen.
Dmytrii Nagirniak 12.01.2010 21:52
quelle
0

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%     
Viktor Balykhin 19.04.2016 00:53
quelle

Tags und Links