Äquivalent von "Dim As String * 1" VB6 zu VB.NET
Habe ich einige VB6-code, der muss migriert werden VB.NET und ich wollte Fragen über diese Zeile des Codes, und sehen, ob es einen Weg gibt, zu implementieren .NET
Dim strChar1 As String * 1
Intellisense sagt mir, dass ein Ende der Anweisung erwartet wird.
- Das was du da hast ist ein string fester Länge. Wie ist zu erklären, dass ein in VB.NET diskutiert wird here.
- Ich sah, dass auch, aber persönlich würde ich mich scheuen, von VBFixedStringAttribute. Es ist eines der vielen Dinge, die in der Microsoft.VisualBasic namespace, wurde ein carry-over von VB6, um die Konvertierung zu VB.NET einfacher, wenn .NET zum ersten mal aus, aber IMHO ist es fast immer besser, zu vermeiden, die meisten der Sachen in diesem namespace und entscheiden Sie sich für den entsprechenden "standard" .NET Framework-Funktionen statt. Ich meine, Sie selbst behielt den alten VB6-error-handling-Modell mit
On Error
,Goto
undResume
, obwohl Ausnahmen sind die bestimmt (und leistungsfähiger) Weg, um Fehler zu behandeln in .NET-code 😉 - Ich habe nicht wirklich sah in die VBFixedStringAttribute-Klasse, um festzustellen, ob es zu benutzen ist eine schlechte Idee oder nicht, aber ich glaube, diese Frage ist ein dupe von der, die ich verlinkt. Ich denke auch, deine Antwort ist besser als diejenigen, die dort gefunden werden, also +1 bis Sie. (und ja, ich Stimme mit Ihnen überein, dass mit dem alten VB6-Stil, ist die Fehlerbehandlung schlechte Wahl in eine VB.NET app!)
- Warum vermeiden Sie, dass der namespace? Es ist nur eine .Net-assembly, wie jeder andere auch! Es ist ein Teil von VB und es gibt keinen Grund, es nicht zu verwenden. Es ist nicht Weg. Jetzt Microsoft.VisualBasic.Kompatibilität Montage ist ein zu vermeiden, wenn.
- Stimmt,
Microsoft.VisualBasic.Compatibility
ist noch viel schlimmer, aber dieMicrosoft.VisualBasic
namespace kann auch Kopfschmerzen verursachen. Teil des Problems ist, dass es ausgelegt ist, so ähnlich wie VB6, dass es wird verwirrend, wenn es tatsächlich nicht die gleiche Weise funktionieren. Zum Beispiel, Sie sogar re-implementiert die meisten der VB6-Datum-und-Zeit-Funktionen (wieDateSerial
und Freunde), auch wenn die .NET framework hat bereits Klassen, die all diese Dinge tun. Ein weiteres Beispiel: es ist verwirrend, wenn die Hälfte der code verwendet die old-style -ErrObject
und die Hälfte verwendet .NET-Ausnahmen, zum Beispiel. - Dies hängt von der Programmierer natürlich, aber zumindest in meiner Erfahrung VB.NET versucht Spiegel Sie die VB6-runtime und die Förderung der gleichen Art der Programmierung nur zu Verwirrung geführt, für die Entwickler hier, und es ermutigt Sie, nicht erforschen den rest .NET oder tatsächlich lernen, wie zu schreiben, Objekt-orientierten code, denn Sie waren zufrieden mit dem "global" - Klassen und-Funktionen VB.NET vorausgesetzt, die sind eigentlich nur Wrapper um native .NET-Klassen. YMMV, natürlich.
- Verwandte: Wie deklarieren Sie eine Zeichenfolge fester Länge in VB.NET? (Nur mit denn dies hat den besonderen Fall, dass ein einzelnes Zeichen Zeichenfolge.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist bekannt als ein "fester Länge" string. Es gibt keine genaue Entsprechung in VB.NET.
In der Regel, Zeichenfolgen fester Länge werden nur in VB6, wenn Sie das Lesen eine Feste Größe von Datensätzen aus einer Datei oder über das Netzwerk (D. H. Parsen der Header in einem protokollrahmen).
Zum Beispiel, haben Sie vielleicht eine Datei, die enthält eine Reihe von Datensätzen fester Länge, die alle das format (integer, 1-Zeichen-string, double), die Sie darstellen könnte, in VB6 als ein Benutzer-definierter Typ:
Diese Weise, VB6-code, der liest aus der Datei die Datensätze in diesem format Lesen können mit fester Größe Datensatz in der Datei gespeichert, und es wird vor allem nur Lesen, 1 byte für
aSingleCharacter
. Ohne die* 1
VB6 hätte keine Ahnung, wie viele Zeichen aus der Datei Lesen, da einString
normalerweise kann eine beliebige Anzahl von Zeichen.In VB.NET führen Sie eine der folgenden, je nach Ihren Bedürfnissen:
Wenn die Länge ankommt (D. H. Sie müssen genau Lesen ein byte von einigen Datenquelle, zum Beispiel) betrachten Sie ein array verwenden, anstatt, wie
Dim aSingleByteArray(1) As Byte
Alternativ können Sie eine der Stream Klassen. Insbesondere, wenn Sie das Lesen von Daten von einem Netzwerk-socket oder eine Datei, ziehen Sie die Verwendung NetworkStream oder FileStream, beziehungsweise. Ein Stream gemeint ist für byte-für-byte-Zugriff (d.h. raw-binary-Zugriff). StreamReader ist eine Verwandte Klasse, die vereinfacht, die Daten zu Lesen, wenn es ist text-basiert, also das könnte gut sein, wenn Sie beim Lesen einer text-Datei, zum Beispiel. Ansonsten (wenn Umgang mit binären Daten), stick mit einem der Stream Klassen.
Wenn die Länge spielt keine Rolle, man könnte einfach eine "normale"
String
. Das heißt:Dim aNormalString As String
Welche Antwort die "richtige" hängt wirklich davon ab, warum wurde es erklärt, dass die Art und Weise, in der original VB6-code.
Den Zeichenfolgen fester Länge als veraltet angesehen VB.NET da gibt es einige bessere Optionen.
Seit Ihrem string fester Länge ist nur ein Zeichen lang ist, können Sie mithilfe der Char-Typ in diesem Fall, wie Mark vorgeschlagen.
Sehen, wie du tust ein VB6-migration, würde ich auf jeden Fall berücksichtigen
VBFixedStringAttribute
sowie die anderen aufgeführten Optionen von Mike Spross, aber in diesem Fall, denn es ist ein einzelnes Zeichen, einChar
kann eine option sein, auch in diesem Fall.Wie an anderer Stelle erwähnt
VBFixedString
wird nur anerkannt, durch dieGet
undPut
VB I/O-API. Also die beste Lösung (außer den code so umschreiben, dass auf die "string fester Länge") ist zum schreiben Ihrer eigenen entsprichtMicrosoft.VisualBasic.Compatibility.VB6.FixedLengthString
. Sehen diese Antwort für mehr details.Char
entspricht hängt vom Kontext ab. In VB6 werden die Zeichenfolgen als Unicode gespeichert, aber wenn Sie Lesen oder schreiben einer Datei, einString * 1
behandelt wird als ein einzelnes byte (8 bits), nicht als ein Zeichen (16 bit), selbst wenn Sie ein Unicode-Zeichen in der Zeichenfolge. VB6 auch automatisch konvertiert string-Parameter in ASCII, wenn Sie den Aufruf von externen Funktionen (z.B. Windows-API-Aufrufe) deklariert, mit einemString
parameter. In diesem Sinne, VB.NET'sString
Datentyp (vorgeschlagen in meiner Antwort) ist technisch nicht gleichwertig entweder aus dem gleichen Grund. Es hängt davon ab, was der OP damit machen.