Эквивалент "Dim As String * 1" VB6 для VB.NET - PullRequest
7 голосов
/ 06 марта 2012

У меня есть некоторый код VB6, который необходимо перенести в VB.NET, и я хотел бы узнать об этой строке кода и посмотреть, есть ли способ реализовать его в .NET

Dim strChar1 As String * 1

Intellisense постоянно говорит мне, что ожидается конец заявления.

Ответы [ 3 ]

10 голосов
/ 06 марта 2012

Это называется строкой фиксированной длины.В VB.NET нет точного эквивалента.

Редактировать : Хорошо, хорошо, есть VBFixedStringAttribute , но яЯ уверен, что он существует исключительно для того, чтобы инструменты автоматической миграции могли более легко преобразовать код VB6 в VB.NET для вас, и на самом деле это не «способ .NET».Также см. Предупреждения в статье, чтобы узнать, почему это по-прежнему не то же самое, что строка фиксированной длины в VB6.

Обычно строки фиксированной длины используются только в VB6, есливы читаете записи фиксированного размера из файла или по сети (то есть анализируете заголовки в кадре протокола).

Например, у вас может быть файл, содержащий набор записей фиксированной длины, которые все имеютформат (целое число, 1-символьная строка, двойная) , который вы можете представить в VB6 как пользовательский тип:

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

Таким образом, код VB6, который читает изфайл, содержащий записи в этом формате, может читать каждую запись фиксированного размера, сохраненную в файле, и, в частности, он будет читать только 1 байт для aSingleCharacter.Без * 1 VB6 не знал бы, сколько символов нужно прочитать из файла, поскольку String обычно может содержать любое количество символов.

В VB.NET вы можете выполнить один изследующие, в зависимости от ваших потребностей:

  • Если длина имеет значение (например, вам необходимо прочитать ровно один байт из какого-либо источника данных, например), рассмотрите возможность использования массива, например,

    Dim aSingleByteArray(1) As Byte

  • В качестве альтернативы вы можете использовать один из классов Stream .В частности, если вы читаете данные из сетевого сокета или файла, рассмотрите возможность использования NetworkStream или FileStream , соответственно. Stream предназначен для побайтового доступа (то есть необработанного двоичного доступа). StreamReader - это связанный класс, который упрощает чтение данных, когда они основаны на тексте, что может быть полезно, например, при чтении текстового файла.В противном случае (если речь идет о двоичных данных), придерживайтесь одного из Stream классов.

  • Если длина не имеет значения, вы можете просто использовать "нормальный""String.То есть:

    Dim aNormalString As String

Какой ответ является «правильным», действительно зависит от того, почему он был объявлен таким образом в исходном коде VB6.

2 голосов
/ 06 марта 2012

Строки фиксированной длины устарели в VB.NET, потому что есть несколько лучших вариантов.

Поскольку ваша строка фиксированной длины имеет длину всего один символ, в этом случае вы можете использовать тип Char, как предложил Марк.

Dim strChar1 As Char
2 голосов
/ 06 марта 2012

Поскольку вы выполняете миграцию на VB6, я определенно рассмотрю VBFixedStringAttribute, а также другие опции, перечисленные Майком Спроссом, но в этом случае, поскольку это один символ, Char может в этом случае тоже подойдет.

Как уже упоминалось, VBFixedString подтверждается только API Get и Put VB I / O. Поэтому лучшее решение (кроме переписывания вашего кода, который ссылается на «строку фиксированной длины») - это написать собственный эквивалент Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString. См. этот ответ для получения более подробной информации.

...