7
votes

Équivalent de "DIM AS String * 1" VB6 à VB.NET

J'ai un code VB6 qui doit être migré vers VB.NET et je voulais me renseigner sur cette ligne de code et voir s'il existe un moyen de le mettre en œuvre dans .NET

Dim strChar1 As String * 1


7 commentaires

Ce que vous avez il y a une chaîne de longueur fixe. Comment déclarer un dans vb.net est discuté ici < / a>.


@Jay: J'ai vu cela aussi, mais personnellement, j'y écarais de vbfixedstringattribute . C'est l'une des nombreuses choses de l'espace de noms Microsoft.Visualbasic un report de VB6 pour faciliter la conversion de VB.NET lorsque .NET est sorti, mais je suis presque toujours préférable d'éviter la plupart des trucs dans cet espace de noms et optent à la place de la fonctionnalité "standard" équivalente "standard". Je veux dire, ils ont même gardé l'ancien modèle de manutention d'erreur VB6 avec sur erreur , goto et reprend , même si des exceptions sont les exceptions (et plus puissant) moyen de gérer les erreurs de code .NET ;-)


@MIKE - Je n'ai pas vraiment examiné la classe VBFixedstringattribute pour déterminer si l'utilisation est une mauvaise idée ou non, mais je crois que cette question est une dupe de celle que j'ai liée. Je pense aussi que votre réponse est meilleure que celle trouvée là-bas, donc +1 à vous. (Et bien sûr, je suis d'accord avec vous que l'utilisation de l'ancien style de traitement des erreurs du VB6 est médiocre dans une application VB.net!)


@Mike Pourquoi éviter cet espace de noms? C'est juste un .NET Assembly, comme tout autre! Cela fait partie de VB et il n'y a aucune raison de ne pas l'utiliser. Ça ne va pas disparaître. Maintenant, l'assemblage Microsoft.VisualBasic.compatibilité est à éviter, cependant.


@Chris: True, Microsoft.VisualBasic.chability est beaucoup pire, mais le Microsoft.VisualBasic Espace de noms peut provoquer des maux de tête. Une partie du problème est qu'elle est conçue pour fonctionner de manière aussi semblable à VB6 qu'il devient déroutant lorsqu'il ne fonctionne pas réellement de la même manière. Par exemple, ils ont même rétabli la plupart des fonctions de date et de temps VB6 (comme datestériennes et amis), même si le framework .NET dispose déjà de classes toutes ces choses. Un autre exemple: il est confus lorsque la moitié du code utilise l'ancien style errrobject et la moitié utilise des exceptions .NET, par exemple.


@Chris: Cela dépend du programmeur bien sûr, mais du moins dans mon expérience vb.net tente de refléter le temps d'exécution VB6 et d'encourager le même style de programmation vient de conduire à la confusion pour les développeurs ici, et il les a également encouragés à ne pas explorer la reste de .net ou pour apprendre à écrire un code orienté objet, car ils étaient satisfaits d'utiliser toutes les classes "globales" et les fonctions VB.NET fournies, qui ne sont vraiment que des wrappers autour des classes de Native .NET. YMMV, bien sûr.


Connexe: Comment déclarer une chaîne de longueur fixe dans vb.net? (uniquement liée car cela a le cas particulier d'être une seule chaîne de caractères.)


5 Réponses :


10
votes

c'est appelé une chaîne "longueur fixe". Il n'y a pas d'équivalent exact dans vb.net.

edit : Eh bien, ok, il y a VBFixedStringAttribute , mais je suis sûr que cela existe uniquement pour que les outils de migration automatisés puissent convertir plus facilement le code VB6 en VB.NET pour vous, et ce n'est pas vraiment le ". façon "de faire des choses. Voir également les avertissements de l'article pour plus de détails sur la raison pour laquelle cela n'est toujours pas exactement la même chose qu'une chaîne de longueur fixe dans VB6.

Généralement, les chaînes de longueur fixe ne sont utilisées que dans VB6 si vous lisez des enregistrements de taille fixe à partir d'un fichier ou sur le réseau (c.-à-d. Les en-têtes d'analyse dans un cadre de protocole).

Par exemple, vous pourriez avoir un fichier contenant un ensemble d'enregistrements de longueur fixe qui ont tous le format (entier, 1-caractère-string, double) , que vous pourriez représenter dans VB6 en tant qu'utilisateur Type défini: xxx

de cette façon, le code VB6 qui se lit à partir des enregistrements contenant des fichiers de ce format peut lire chaque enregistrement de taille fixe stocké dans le fichier, et en particulier, Il ne sera lu que 1 octet pour asingLecharacter . Sans le * 1 , VB6 n'aurait aucune idée du nombre de caractères à lire depuis le fichier, car une chaîne peut normalement avoir un nombre de caractères.

Dans VB.net, vous pouvez faire l'une des opérations suivantes, en fonction de vos besoins:

  • Si la longueur est importante (c'est-à-dire que vous devez lire exactement un octet de certaines sources de données, par exemple), envisagez d'utiliser un tableau, tel que

    DIM asfinlebyeArray (1) en tant qu' octet

  • Alternativement, vous pouvez utiliser l'un des Stream classes. En particulier, si vous lisez des données à partir d'une prise réseau ou d'un fichier, envisagez d'utiliser Networkstream ou filtream , respectivement. Un flux est destiné à un accès d'octet-forfyte (c'est-à-dire un accès binaire brut). streamReader est un élément associé La classe qui simplifie la lecture de données lorsqu'elle est basée sur le texte, de sorte que cela puisse être bon si vous lisez un fichier texte, par exemple. Sinon (si vous traitez avec des données binaires), collez-vous avec l'un des classes strong>.

  • Si la longueur n'a pas d'importance, vous pouvez simplement utiliser une chaîne "normale" . C'est-à-dire:

    DIM ANORMALSRING AS String

    Quelle réponse est "correct" dépend vraiment de la raison pour laquelle elle a été déclarée dans le code VB6 d'origine.


0 commentaires

2
votes

Voir comme vous faites une migration VB6, j'envisagerai certainement vbfixedstringattribute ainsi que les autres options répertoriées par Mike Spross, mais dans ce cas, car c'est un seul caractère, Un Char peut être une option dans ce cas aussi.

Comme mentionné ailleurs vbfixedstring est uniquement reconnu par le Obtenir et mettre VB I / O API. Donc, la meilleure solution (autre que la réécriture de votre code qui fait référence à la "chaîne de longueur fixe") consiste à écrire votre propre équivalent de microsoft.visalbasic.compatibility.vb6.fixedlengthstring . Voir Cette réponse pour plus de détails.


2 commentaires

Char est certainement l'équivalent le plus proche.


@Derek: si char est équivalent dépend du contexte. Dans VB6, les chaînes sont stockées comme unicode, mais si vous lisez ou écrivez un fichier, une chaîne 1 est traitée comme un seul octet (8 bits), pas comme un caractère (16 bits), Même si vous mettez un caractère unicode dans la chaîne. VB6 convertit également automatiquement les paramètres de chaîne en ASCII lorsque vous appelez des fonctions externes (I.E. Appels d'API Windows) déclarés avec un paramètre de chaîne . Sur cette note, le type de données de VB.NET (suggéré dans ma réponse) n'est pas techniquement équivalent pour la même raison. Cela dépend de ce que fait l'OP avec elle.



2
votes

Les chaînes de longueur fixe ont été obsolètes dans VB.NET car il existe plusieurs meilleures options.

Étant donné que votre chaîne de longueur fixe n'est qu'un caractère long, vous pouvez utiliser le type de caractère dans ce cas, comme marque suggérée. < / p> xxx


0 commentaires

0
votes

vbfixedstringattribute classe

DIM STRCHAR1 en tant que chaîne


2 commentaires

Cette question a été répondue il y a 7 ans. Si vous pensez que votre réponse est mieux comparée à la réponse acceptée, veuillez ajouter des informations supplémentaires ou une explication.


Je n'ai plus d'informations sur la définition de la variable à la chaîne de longueur fixe.



0
votes

Bien que cette question ait été posée il y a longtemps, vb.net dispose d'une chaîne de longueur fixe autochtone - FXDRING publique en tant que char () 'Déclarez une matrice fixe à 10 caractères. Faire cela avec des scalaires crée en fait des matrices statiques de style VB6.


2 commentaires

Votre réponse pourrait être améliorée avec des informations justificatives supplémentaires. S'il vous plaît Modifier pour ajouter des détails supplémentaires, tels que des citations ou une documentation, de sorte que d'autres puissent confirmer que votre réponse est correcte. Vous pouvez trouver plus d'informations sur la façon d'écrire de bonnes réponses dans le centre d'aide .


Pour une documentation sur VBFixedarray Comparer: Docs .microsoft.com / fr-US / DotNet / API / ...