2012-03-06 14 views
7

Tengo un código VB6 que necesita ser migrado a VB.NET, y quería preguntar acerca de esta línea de código, y ver si hay alguna manera para implementarlo en .NETEquivalente a "Dim As String * 1" VB6 a VB.NET

Dim strChar1 As String * 1 

Intellisense me sigue diciendo que se espera un final de la declaración.

+5

Lo que tienes allí es una cadena de longitud fija. Cómo se declara uno en VB.NET se discute [aquí] (http://stackoverflow.com/questions/2305377/how-to-declare-a-fixed-length-string-in-vb-net). –

+0

@Jay: Yo también vi eso, pero personalmente rehuiría ** ** VBFixedStringAttribute **. Es una de las muchas cosas en el espacio de nombres ** Microsoft.VisualBasic ** que fue una transferencia de VB6 para facilitar la conversión a VB.NET cuando apareció .NET, pero en mi humilde opinión casi siempre es mejor evitar la mayor parte del cosas en ese espacio de nombres y opta por la funcionalidad equivalente "estándar" .NET Framework en su lugar. Quiero decir, incluso conservaron el antiguo modelo de manejo de errores VB6 con 'On Error',' Goto' y 'Resume', aunque las excepciones son la forma intencionada (y más poderosa) de manejar los errores en el código .NET ;-) –

+0

@Mike - Realmente no he investigado la clase VBFixedStringAttribute para determinar si usarla es una mala idea o no, pero creo que esta pregunta es una trampa de la que me he vinculado. También creo que tu respuesta es mejor que las que se encuentran allí, así que +1 para ti. (y, por supuesto, estoy de acuerdo con usted en que usar el viejo estilo VB6 de manejo de errores es una mala elección en una aplicación VB.NET) –

Respuesta

10

Esto se conoce como cadena de "longitud fija". No hay un equivalente exacto en VB.NET.

Editar: Bueno, está bien, no hay VBFixedStringAttribute, pero estoy bastante seguro de que existe únicamente para que las herramientas de migración automatizados pueden convertir más fácilmente el código de VB6 a VB.NET para usted, y no es realmente la "forma de .NET" para hacer cosas. También vea las advertencias en el artículo para obtener detalles sobre por qué esto todavía no es exactamente lo mismo que una cadena de longitud fija en VB6.

Generalmente, las cadenas de longitud fija solo se utilizan en VB6 si está leyendo registros de tamaño fijo desde un archivo o en la red (es decir, analizando encabezados en un marco de protocolo).

Por ejemplo, es posible que tenga un archivo que contiene un conjunto de registros de longitud fija que todos tienen el formato (número entero, 1-serie-caracteres, doble), que se podía representar en VB6 como el usuario tipo definido:

 
Public Type Record 
    anInteger As Integer 
    aSingleCharacter As String * 1 
    aDouble As Double 
End Type 

de esta manera, el código de Visual Basic 6 que lee desde el archivo que contiene los registros en este formato puede leer cada registro fijo de tamaño almacenados en el archivo y, en particular, sólo se leerá 1 byte para aSingleCharacter. Sin el * 1, VB6 no tendría idea de cuántos caracteres leer del archivo, ya que un String normalmente puede tener cualquier cantidad de caracteres.

En VB.NET, puede realizar una de las siguientes, en función de sus necesidades:

  • Si los asuntos de longitud (es decir, es necesario leer exactamente un byte de una fuente de datos, por ejemplo) considerar el uso de una matriz en lugar, como

    Dim aSingleByteArray(1) As Byte

  • como alternativa, puede utilizar uno de los Stream clases. En particular, si está leyendo datos de un socket de red o un archivo, considere usar NetworkStream o FileStream, respectivamente. Una secuencia Stream está destinada para el acceso byte por byte (es decir, acceso binario en bruto). StreamReader es una clase relacionada que simplifica la lectura de datos cuando está basada en texto, por lo que podría ser bueno si está leyendo un archivo de texto, por ejemplo. De lo contrario (si se trata de datos binarios), quédese con una de las clases Stream.

  • Si la longitud no importa, puede utilizar un "normal" String.Es decir:

    Dim aNormalString As String

cuál es la respuesta "correcta" Realmente depende de qué se declaró que forma en el código VB6 originales.

2

Como está haciendo una migración de VB6, definitivamente consideraría VBFixedStringAttribute, así como las otras opciones enumeradas por Mike Spross, pero, en este caso, como es un solo carácter, un Char puede ser una opción en este caso también

Como se mencionó en otra parte VBFixedString solo es reconocido por Get y Put VB I/O API. Entonces, la mejor solución (aparte de reescribir su código que hace referencia a la "cadena de longitud fija") es escribir su propio equivalente de Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString. Ver this answer para más detalles.

+0

Char es sin duda el equivalente más cercano. –

+3

@Derek: Si 'Char' es equivalente depende del contexto.En VB6, las cadenas se almacenan como Unicode, pero si está leyendo o escribiendo un archivo, un 'String * 1' se trata como un solo byte (8 bits), no como un carácter (16 bits), incluso si pone un Carácter Unicode en la cadena. VB6 también convierte automáticamente los parámetros de cadena en ASCII cuando se invocan funciones externas (es decir, llamadas API de Windows) declaradas con un parámetro 'String'. En ese sentido, el tipo de datos 'String' de VB.NET (sugerido en mi respuesta) tampoco es técnicamente equivalente por el mismo motivo. Depende de lo que el OP esté haciendo con él. –

2

Las cadenas de longitud fija han quedado obsoletas en VB.NET porque hay varias opciones mejores.

Dado que su cadena de longitud fija tiene solo un carácter, puede usar el tipo Char en este caso, como sugiere Mark.

Dim strChar1 As Char 
Cuestiones relacionadas