L'équivalent de “Dim as String * 1” VB6 à VB.NET
J'ai quelques VB6 code qui doit être migré vers VB.NET et je voulais savoir à propos de cette ligne de code, et de voir si il y a un moyen de la mettre en œuvre .NET
Dim strChar1 As String * 1
Intellisense continue à me dire qu'une fin de déclaration est attendu.
Ce que vous avez là est une chaîne de longueur fixe. Comment déclarer un dans VB.NET est discuté here.
J'ai vu ça aussi, mais personnellement, je serais timide loin de VBFixedStringAttribute. C'est l'une des nombreuses choses dans le Microsoft.VisualBasic espace de noms a été un report de VB6 à faire de la conversion à VB.NET plus facile quand .NET premier est sorti, mais à mon humble avis, il est presque toujours préférable d'éviter la plupart des choses dans cet espace de noms et d'opter pour l'équivalent de la "norme" .NET Framework à la place. Je veux dire, ils ont même gardé l'ancienne VB6 erreur de manipulation de modèle avec
Je n'ai pas vraiment regardé dans le VBFixedStringAttribute classe afin de déterminer si elle est une mauvaise idée ou pas, mais je crois que cette question est un dupe de celui que j'ai lié. Je pense aussi que votre réponse est mieux que ceux qui s'y trouvent, donc +1 pour vous. (et bien sûr je suis d'accord avec vous que l'utilisation de l'ancien VB6 style de gestion d'erreur est de mauvais choix dans un VB.NET app!)
Pourquoi éviter que l'espace de noms? C'est juste une .Net de l'assemblée, comme les autres! C'est une partie de VB et il n'y a aucune raison de ne pas l'utiliser. Il ne va pas loin. Maintenant Microsoft.VisualBasic.La compatibilité de l'assemblée est celui à éviter, cependant.
Vrai,
J'ai vu ça aussi, mais personnellement, je serais timide loin de VBFixedStringAttribute. C'est l'une des nombreuses choses dans le Microsoft.VisualBasic espace de noms a été un report de VB6 à faire de la conversion à VB.NET plus facile quand .NET premier est sorti, mais à mon humble avis, il est presque toujours préférable d'éviter la plupart des choses dans cet espace de noms et d'opter pour l'équivalent de la "norme" .NET Framework à la place. Je veux dire, ils ont même gardé l'ancienne VB6 erreur de manipulation de modèle avec
On Error
, Goto
et Resume
, même si des exceptions sont prévues (et plus puissants) façon de gérer les erreurs .NET code 😉Je n'ai pas vraiment regardé dans le VBFixedStringAttribute classe afin de déterminer si elle est une mauvaise idée ou pas, mais je crois que cette question est un dupe de celui que j'ai lié. Je pense aussi que votre réponse est mieux que ceux qui s'y trouvent, donc +1 pour vous. (et bien sûr je suis d'accord avec vous que l'utilisation de l'ancien VB6 style de gestion d'erreur est de mauvais choix dans un VB.NET app!)
Pourquoi éviter que l'espace de noms? C'est juste une .Net de l'assemblée, comme les autres! C'est une partie de VB et il n'y a aucune raison de ne pas l'utiliser. Il ne va pas loin. Maintenant Microsoft.VisualBasic.La compatibilité de l'assemblée est celui à éviter, cependant.
Vrai,
Microsoft.VisualBasic.Compatibility
est bien pire, mais le Microsoft.VisualBasic
espace de noms peut causer des maux de tête. Une partie du problème est qu'il est conçu pour fonctionner de façon similaire à VB6 qu'il devient confus quand il ne fait pas travailler de la même façon. Par exemple, ils ont même re-mise en œuvre de la plupart des VB6 date et l'heure de fonctions (comme DateSerial
et amis), même si l' .NET framework a déjà des classes de faire toutes ces choses. Un autre exemple: il est source de confusion lorsque la moitié du code, utilise le style ancien ErrObject
et la moitié utilise .NET des exceptions, par exemple.
OriginalL'auteur Logan B. Lehman | 2012-03-06
Vous devez vous connecter pour publier un commentaire.
Qui est connu comme une "durée fixe" de la chaîne. Il n'y a pas un équivalent exact dans VB.NET.
Généralement, les chaînes de longueur fixe sont utilisés seulement dans VB6, si vous lisez la taille fixe des enregistrements à partir d'un fichier ou sur le réseau (c'est à dire l'analyse des en-têtes dans un protocole frame).
Par exemple, vous pourriez avoir un fichier qui contient un ensemble d'enregistrements de longueur fixe qui ont tous le format (entier, 1-chaîne de caractères, double), ce qui peut se représenter en VB6 comme un type défini par l'utilisateur:
De cette façon, VB6 code qui lit le fichier contenant les enregistrements dans ce format de lecture de chaque taille fixe d'enregistrement stocké dans le fichier, et en particulier, il ne lus 1 octet pour
aSingleCharacter
. Sans le* 1
, VB6 n'ai aucune idée de combien de caractères à lire à partir du fichier, depuis unString
peut normalement avoir un nombre quelconque de caractères.Dans VB.NET vous pouvez effectuer l'une des opérations suivantes, en fonction de vos besoins:
Si la longueur de questions (c'est à dire vous avez besoin de lire exactement un octet de certains de source de données, par exemple), pensez à utiliser un tableau à la place, comme
Dim aSingleByteArray(1) As Byte
Sinon, vous pouvez utiliser l'un des Flux classes. En particulier, si vous êtes à la lecture des données à partir d'une prise réseau ou à un fichier, pensez à utiliser NetworkStream ou FileStream, respectivement. Un Flux est destiné aux octet-par-octet d'accès (c'est à dire binaire brut d'accès). StreamReader une classe qui simplifie la lecture des données lorsqu'il est basé sur du texte, de sorte que pourrait être la bonne si vous êtes à la lecture d'un fichier texte, par exemple. Dans le cas contraire (si vous traitez avec des données binaires), le bâton avec un des Flux classes.
Si la longueur n'a pas d'importance, vous pouvez simplement utiliser un "normal"
String
. C'est-à-dire:Dim aNormalString As String
La réponse "correcte" dépend vraiment pourquoi il a été déclaré que le chemin de l'original du code VB6.
OriginalL'auteur Mike Spross
Les chaînes de longueur fixe a été dépréciée dans les VB.NET parce qu'il y a plusieurs options de meilleure qualité.
Depuis votre chaîne de longueur fixe est juste un caractère de long, vous pouvez utiliser le type Char dans ce cas, comme Mark l'a suggéré.
OriginalL'auteur Pradeep Kumar
De voir que vous êtes en train de faire une migration VB6, je serais certainement envisager
VBFixedStringAttribute
ainsi que les autres options répertoriées par Mike Spross, mais, dans ce cas, parce que c'est un caractère unique, unChar
peut être une option dans ce cas.Comme mentionné ailleurs
VBFixedString
est seulement reconnu par laGet
etPut
VB e/S de l'API. Donc, la meilleure solution (autre que de réécrire ton code qui fait référence à la "chaîne de longueur fixe") est d'écrire votre propre équivalent deMicrosoft.VisualBasic.Compatibility.VB6.FixedLengthString
. Voir cette réponse pour plus de détails.Si
Char
est équivalent dépend du contexte. En VB6, les chaînes sont stockées au format Unicode, mais si vous êtes de la lecture ou de l'écriture d'un fichier, unString * 1
est traité comme un seul octet (8 bits), et non comme un caractère (16 bits), même si vous mettez un caractère Unicode dans la chaîne. VB6 aussi de convertir automatiquement les paramètres de chaîne de caractères ASCII lorsque vous appelez des fonctions externes (c'est à dire des appels d'API Windows) déclarée avec unString
paramètre. Sur cette note, VB.NET'sString
type de données (suggéré dans ma réponse) n'est pas techniquement équivalent pour la même raison. Cela dépend de ce que l'OP est en train de faire avec elle.OriginalL'auteur Mark Hurd