Эквивалент Dim As String * 1 VB6 для VB.NET

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

Dim strChar1 As String * 1

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


person Logan B. Lehman    schedule 06.03.2012    source источник
comment
У вас есть строка фиксированной длины. Как объявить его в VB.NET обсуждается здесь< /а>.   -  person Jay Riggs    schedule 06.03.2012
comment
@Jay: Я тоже это видел, но лично я бы избегал VBFixedStringAttribute. Это одна из многих вещей в пространстве имен Microsoft.VisualBasic, которые были перенесены из VB6, чтобы упростить преобразование в VB.NET, когда .NET только появился, но ИМХО почти всегда лучше избегать большинство вещей в этом пространстве имен и вместо этого выберите эквивалентную стандартную функциональность .NET Framework. Я имею в виду, что они даже сохранили старую модель обработки ошибок VB6 с On Error, Goto и Resume, хотя исключения — это предполагаемый (и более мощный) способ обработки ошибок в коде .NET ;-)   -  person Mike Spross    schedule 06.03.2012
comment
@Mike - я действительно не изучал класс VBFixedStringAttribute, чтобы определить, является ли его использование плохой идеей или нет, но я действительно считаю, что этот вопрос является обманом того, на который я ссылался. Я также думаю, что ваш ответ лучше, чем найденные там, так что +1 вам. (и, конечно же, я согласен с вами в том, что использование старого стиля обработки ошибок VB6 — плохой выбор в приложении VB.NET!)   -  person Jay Riggs    schedule 06.03.2012
comment
@Mike Зачем избегать этого пространства имен? Это просто сборка .Net, как и любая другая! Это часть VB, и нет причин не использовать его. Это не уходит. Теперь сборки Microsoft.VisualBasic.Compatibility следует избегать.   -  person Chris Dunaway    schedule 06.03.2012
comment
@Chris: Правда, Microsoft.VisualBasic.Compatibility намного хуже, но пространство имен Microsoft.VisualBasic может вызвать головную боль. Частично проблема заключается в том, что он разработан так, чтобы работать так же, как VB6, что это сбивает с толку, когда на самом деле он не работает так же. Например, они даже повторно реализовали большинство функций даты и времени VB6 (таких как DateSerial и другие), хотя в среде .NET уже есть классы, выполняющие все эти действия. Другой пример: это сбивает с толку, когда половина кода использует старый стиль ErrObject, а половина использует, например, исключения .NET.   -  person Mike Spross    schedule 06.03.2012
comment
@Chris: Это, конечно, зависит от программиста, но, по крайней мере, по моему опыту, VB.NET пытается отразить среду выполнения VB6 и поощряет тот же стиль программирования, что только приводит разработчиков в замешательство, а также побуждает их не исследовать остальной части .NET или научиться писать объектно-ориентированный код, потому что они довольствовались использованием всех глобальных классов и функций, предоставляемых VB.NET, которые на самом деле являются просто оболочками для собственных классов .NET. ЮММВ, конечно.   -  person Mike Spross    schedule 06.03.2012
comment
Связано: Как объявить строку фиксированной длины в VB.NET? (Только связано, потому что это имеет особый случай строка из одного символа.)   -  person Mark Hurd    schedule 01.11.2014


Ответы (4)


Это называется строкой фиксированной длины. Точного эквивалента в 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

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

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

    Dim aNormalString As String

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

person Mike Spross    schedule 06.03.2012

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

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

Dim strChar1 As Char
person Pradeep Kumar    schedule 06.03.2012

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

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

person Mark Hurd    schedule 06.03.2012
comment
Char, безусловно, является ближайшим эквивалентом. - person Derek Tomes; 06.03.2012
comment
@Derek: Эквивалентность Char зависит от контекста. В VB6 строки хранятся в формате Unicode, но если вы читаете или записываете файл, String * 1 обрабатывается как один байт (8 бит), а не как символ (16 бит), даже если вы помещаете символ Unicode в нить. VB6 также автоматически преобразует строковые параметры в ASCII, когда вы вызываете внешние функции (т. е. вызовы Windows API), объявленные с параметром String. В этой заметке тип данных VB.NET String (предложенный в моем ответе) технически не эквивалентен по той же причине. Это зависит от того, что ОП делает с ним. - person Mike Spross; 06.03.2012

Класс VBFixedStringAttribute

<VBFixedString(1)> Dim strChar1 As String

person profess79    schedule 12.12.2019
comment
На этот вопрос ответили 7 лет назад. Если вы считаете, что ваш ответ лучше принятого ответа, добавьте дополнительную информацию или объяснение. - person Maxim Sagaydachny; 12.12.2019
comment
У меня больше нет информации о том, как установить переменную для исправления длины строки. - person profess79; 13.12.2019