Wie soll ich in VB.NET umwandeln?

151

Sind alle gleich? Unter welchen Umständen sollte ich mich gegenseitig vorziehen?

  • var.ToString ()

  • CStr (var)

  • CType (var, String)

  • DirectCast (var, String)


EDIT: Vorschlag von NotMyself

  • TryCast (var, String)
Zack Peterson
quelle

Antworten:

156

Diese sind alle leicht unterschiedlich und haben im Allgemeinen eine akzeptable Verwendung.

  • var.ToString()gibt Ihnen die Zeichenfolgendarstellung eines Objekts, unabhängig davon, um welchen Typ es sich handelt. Verwenden Sie diese Option, wenn varnoch keine Zeichenfolge vorhanden ist.
  • CStr(var)ist der VB-String-Cast-Operator. Ich bin kein VB-Typ, also würde ich vorschlagen, es zu vermeiden, aber es wird nichts wirklich schaden. Ich denke, es ist im Grunde das gleiche wie CType.
  • CType(var, String) konvertiert den angegebenen Typ unter Verwendung aller bereitgestellten Konvertierungsoperatoren in eine Zeichenfolge.
  • DirectCast(var, String)wird verwendet, um ein Objekt in eine Zeichenfolge umzuwandeln. Wenn Sie wissen, dass eine Objektvariable tatsächlich eine Zeichenfolge ist, verwenden Sie diese. Dies ist das gleiche wie (string)varin C #.
  • TryCast (wie von @ erwähnt NotMyself erwähnt ) ist wie DirectCast, aber es wird zurückgegeben, Nothingwenn die Variable nicht in eine Zeichenfolge konvertiert werden kann, anstatt eine Ausnahme auszulösen . Dies ist das gleiche wie var as stringin C #. Die TryCastSeite auf MSDN hat auch einen guten Vergleich.
bdukes
quelle
15
Es gibt nie einen Grund, CType (var, String) anstelle von CStr (var) zu verwenden, sie machen genau das Gleiche.
Jonathan Allen
2
@ Maslow TryCastfunktioniert nur für Werttypen , da es ein Typ sein muss, der Nothingals Wert haben kann
bdukes
1
@ Martinin ganz richtig. Das sollte
heißen
3
CStr(var)wird ersticken und eine Ausnahme auslösen, wenn die Variable DBNull.Value ist, aber die Alternative Convert.ToString(var)eine leere Zeichenfolge zurückgibt .
MCattle
Dim myList AS ArrayList=new ArrayListWenn Sie schreiben (From e In myList select CType(e.Name,String)).ToArray(), funktioniert es nicht. Ich kam zum Schreiben ... select CType(e.Name.ToString,String)).ToArray()und holte mein Lächeln zurück.
Bellash
13

Cstr() wird für eine bessere Leistung inline kompiliert.

CType Ermöglicht Umwandlungen zwischen Typen, wenn ein Konvertierungsoperator definiert ist

ToString() Zwischen Basistyp und Zeichenfolge wird eine Ausnahme ausgelöst, wenn keine Konvertierung möglich ist.

TryParse()Von String zu Basis typeifmöglich, sonst wird false zurückgegeben

DirectCastWird verwendet, wenn die Typen über die Vererbung verknüpft sind oder eine gemeinsame Schnittstelle verwenden, wird eine Ausnahme ausgelöst, wenn die Umwandlung nicht möglich ist. trycastIn diesem Fall wird nichts zurückgegeben

Siddharth Rout
quelle
8

MSDN scheint darauf hinzudeuten, dass die Cxxx-Casts für bestimmte Typen die Leistung in VB .NET verbessern können, da sie in Inline-Code konvertiert werden. Aus irgendeinem Grund wird auch DirectCast vorgeschlagen in bestimmten Fällen im Gegensatz zu CType vorgeschlagen (in den Dokumentationen wird angegeben, dass eine Vererbungsbeziehung besteht. Ich glaube, dies bedeutet, dass die Richtigkeit der Besetzung zur Kompilierungszeit überprüft wird und Optimierungen angewendet werden können, während CType immer die verwendet VB-Laufzeit.)

Wenn ich VB .NET-Code schreibe, hängt das, was ich verwende, davon ab, was ich tue. Wenn es sich um Prototypcode handelt, den ich wegwerfen werde, verwende ich alles, was ich gerade schreibe. Wenn es sich um Code handelt, den ich ernst meine, versuche ich, eine Cxxx-Besetzung zu verwenden. Wenn es keine gibt, verwende ich DirectCast, wenn ich der festen Überzeugung bin, dass eine Vererbungsbeziehung besteht. Wenn es eine Situation ist, in der ich keine Ahnung habe, ob die Umwandlung erfolgreich sein sollte (Benutzereingabe -> Ganzzahlen zum Beispiel), verwende ich TryCast, um etwas Freundlicheres zu tun, als dem Benutzer eine Ausnahme zuzuweisen.

Eine Sache, die ich nicht abschütteln kann, ist, dass ich ToString anstelle von CStr verwende, aber angeblich ist Cstr schneller.

OwenP
quelle
8

Ich bevorzuge die folgende Syntax:

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

Hah, Sie können sagen, dass ich normalerweise Code in C # schreibe. 8)

Der Grund, warum ich TryCast bevorzuge, ist, dass Sie sich nicht mit dem Aufwand für Casting-Ausnahmen herumschlagen müssen. Ihre Besetzung ist entweder erfolgreich oder Ihre Variable wird auf null initialisiert, und Sie gehen entsprechend damit um.

Nicht ich
quelle
2
Ich denke du liegst falsch. Es ist keine gute Idee, TryCast überhaupt zu verwenden. In einem Fall wie Ihrem sollte number.ToString () oder CStr (number) verwendet werden.
Shimmy Weitzhandler
4
@Shimmy: Was ist der Grund dafür, dass TryCast überhaupt nicht verwendet wird? Ist es nicht besser, dass DirectCast in bestimmten Szenarien eine Ausnahme vermeidet?
Dienekes
3
@ Dienekes und NotMyself. TryCast ist nur für REFERENCE-Typen. Hier haben wir eine Ganzzahl, die ein VALUE-Typ ist. Der Compiler lehnt TryCast ab. Das Ziel ist auch ein String. Jede .Net-Entität außer Nothing unterstützt .ToString(). Ein Werttyp wie Integer kann nicht Nothing sein. In diesem Fall ist entweder CStr (Nummer) oder Nummer.ToString () sicher. Im allgemeinen Fall (nicht nur Werttypen) ist CStr (was auch immer) sicher, da es Nothing verarbeiten kann - das Ergebnis ist Nothing in der String-Variablen. TryCast ist sehr nützlich - nur nicht hier.
ToolmakerSteve
4

Benutzer Konrad Rudolph befürwortet DirectCast () in der Stapelüberlauffrage "Versteckte Funktionen von VB.NET" .

Zack Peterson
quelle
-1, weil DirectCast hier offensichtlich NICHT angemessen ist, außer in einer sehr begrenzten Situation, die Sie nicht erwähnt haben. DirectCast ist gut, wenn Sie wissen, dass Sie zwei VERWANDTE REFERENZTYPEN haben und ein effizientes Casting zwischen ihnen wünschen. Da es um die Erlangung von a geht String, ist es unwahrscheinlich, dass das OP eine Situation erörtert hat, in der DirectCast angemessen ist.
ToolmakerSteve
... Wenn die Frage nicht erwähnt worden wäre Stringund ToString, würde meine Beschwerde nicht zutreffen. Sie sollten sich nicht für DirectCast einsetzen, bis Sie das Thema von der allgemeinen KONVERTIERUNG eingegrenzt haben.
ToolmakerSteve
1

Laut Zertifizierungsprüfung sollten Sie Convert.ToXXX () nach Möglichkeit für einfache Konvertierungen verwenden, da es die Leistung besser optimiert als CXXX-Konvertierungen.

SickPuP
quelle
1
Zu Ihrer Information: Laut Paul Vick von Microsoft waren die Cxxx-Operatoren zumindest im Jahr 2004 schneller als die Convert.Toxxx-Funktionen, da Cxxx direkt in IL kompiliert wird, anstatt eine Funktion aufzurufen. Obwohl seine Begründung zweifelhaft erscheint, angesichts der Fähigkeit, Funktionsaufrufe JIT-zu optimieren. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve
0

Ich erinnere mich einmal, dass der MSDN-Bibliotheksstatus CStr () verwendet hat, weil er schneller war. Ich weiß allerdings nicht, ob das stimmt.

joek1975
quelle
2
DirectCast ist schneller als CStr, aber Sie können es nur verwenden, wenn Sie ein Zeichenfolgenobjekt in eine Zeichenfolgenvariable umwandeln. Es schlägt fehl, wenn Sie versuchen, ein anderes Objekt in eine Zeichenfolge zu konvertieren.
Jonathan Allen