2012-03-06 25 views
7

Ho un codice VB6 che deve essere migrato a VB.NET, e volevo informarmi su questa linea di codice, e vedere se c'è un modo per implementarlo in .NETEquivalente di "Dim as String * 1" VB6 a VB.NET

Dim strChar1 As String * 1 

Intellisense continua a dirmi che è prevista una fine della dichiarazione.

+5

Quello che hai è una stringa di lunghezza fissa. Come dichiarare uno in VB.NET è discusso [qui] (http://stackoverflow.com/questions/2305377/how-to-declare-a-fixed-length-string-in-vb-net). –

+0

@Jay: L'ho visto anche io, ma personalmente avrei evitato ** VBFixedStringAttribute **. È una delle tante cose nello spazio dei nomi ** Microsoft.VisualBasic ** che è stato trasferito da VB6 per rendere più facile la conversione in VB.NET quando .NET è uscito per la prima volta, ma IMHO è quasi sempre meglio evitare la maggior parte roba in quel namespace e optare invece per l'equivalente funzionalità "standard" .NET Framework. Voglio dire, hanno anche mantenuto il vecchio modello di gestione degli errori VB6 con 'On Error',' Goto' e 'Resume', anche se le eccezioni sono il modo previsto (e più potente) di gestire gli errori nel codice .NET ;-) –

+0

@ Mike - Non ho davvero esaminato la classe VBFixedStringAttribute per determinare se usarlo è una cattiva idea o no, ma credo che questa domanda sia un errore di quello a cui mi sono collegato. Penso anche che la tua risposta sia migliore di quella che trovi lì, quindi +1 a te. (e ovviamente sono d'accordo con te sul fatto che l'uso del vecchio stile VB6 di gestione degli errori è una scelta sbagliata in un'app VB.NET!) –

risposta

10

Questo è noto come una stringa "lunghezza fissa". Non esiste un equivalente esatto in VB.NET.

Edit: Beh, OK, c'è VBFixedStringAttribute, ma sono abbastanza sicuro che esiste solo in modo che gli strumenti di migrazione automatici possono più facilmente convertire il codice VB6 a VB.NET per voi, e non è davvero il "modo .NET" per fare le cose. Vedi anche gli avvertimenti nell'articolo per i dettagli sul perché questo non è ancora esattamente la stessa cosa di una stringa di lunghezza fissa in VB6.

In generale, stringhe di lunghezza fissa vengono utilizzati solo in VB6 se state leggendo record di dimensione fissa da un file o in rete (vale a dire analizzare le intestazioni in una cornice di protocollo).

Per esempio, si potrebbe avere un file che contiene un insieme di record a lunghezza fissa che tutti hanno il formato (intero, 1-character-string, doppio), che si può rappresentare in VB6 come dall'utente tipo definito:

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

in questo modo, il codice VB6 che legge dal file che contiene i record in questo formato in grado di leggere ogni record fisso di dimensioni memorizzati nel file, e, in particolare, si legge solo 1 byte per aSingleCharacter. Senza lo * 1, VB6 non avrebbe idea di quanti caratteri leggere dal file, dal momento che un String può normalmente avere un numero qualsiasi di caratteri.

In VB.NET, è possibile effettuare una delle seguenti operazioni, a seconda delle esigenze:

  • Se le questioni di lunghezza (cioè è necessario leggere esattamente un byte da una sorgente di dati, ad esempio) considerare l'utilizzo di un array invece, come

    Dim aSingleByteArray(1) As Byte

  • in alternativa, è possibile utilizzare uno dei Stream classi. In particolare, se stai leggendo i dati da un socket di rete o da un file, considera l'utilizzo di NetworkStream o FileStream, rispettivamente. A Il flusso è inteso per l'accesso byte per byte (ad esempio accesso binario non elaborato). StreamReader è una classe correlata che semplifica la lettura dei dati quando è basata su testo, pertanto potrebbe essere utile se si sta leggendo un file di testo, ad esempio. In caso contrario (se si tratta di dati binari), attenersi a una delle classi Stream.

  • Se la lunghezza non è importante, è sufficiente utilizzare un "normale" String.Vale a dire:

    Dim aNormalString As String

Quale risposta è "corretta" in realtà dipende il motivo per cui è stato dichiarato in questo modo nel codice VB6 originale.

2

Visto che si sta eseguendo una migrazione VB6, prenderei sicuramente in considerazione lo VBFixedStringAttribute e le altre opzioni elencate da Mike Spross, ma, in questo caso, poiché si tratta di un singolo carattere, un Char potrebbe essere un'opzione anche in questo caso.

Come accennato altrove VBFixedString è riconosciuto solo dall'API di I/O VB Get e Put VB. Quindi la soluzione migliore (oltre a riscrivere il tuo codice che fa riferimento alla "stringa di lunghezza fissa") è scrivere il tuo equivalente di Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString. Vedi this answer per maggiori dettagli.

+0

Char è sicuramente l'equivalente più vicino. –

+3

@Derek: Se 'Char' è equivalente dipende dal contesto.In VB6, le stringhe sono archiviate come Unicode, ma se stai leggendo o scrivendo un file, un 'String * 1' viene trattato come un singolo byte (8 bit), non come un carattere (16 bit), anche se tu metti un Carattere Unicode nella stringa. VB6 converte inoltre automaticamente i parametri stringa in ASCII quando chiamate funzioni esterne (ad esempio chiamate API Windows) dichiarate con un parametro 'String'. Su tale nota, il tipo di dati 'String' di VB.NET (suggerito nella mia risposta) non è tecnicamente equivalente né per lo stesso motivo. Dipende da cosa l'OP sta facendo con esso. –

2

Le stringhe a lunghezza fissa sono state dichiarate obsolete in VB.NET perché ci sono diverse opzioni migliori.

Poiché la stringa di lunghezza fissa è composta da un solo carattere, in questo caso è possibile utilizzare il tipo Carattere, come suggerito da Mark.

Dim strChar1 As Char 
Problemi correlati