我有一些需要迁移到VB.NET的VB6代码,我想询问这行代码,看看是否有办法在.NET中实现它
Dim strChar1 As String * 1
Intellisense一直告诉我语句结束是预期的。
答案 0 :(得分:10)
这就是所谓的“固定长度”字符串。 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代码可以读取存储在文件中的每个固定大小的记录,特别是,它只会读取aSingleCharacter
的1个字节。如果没有* 1
,VB6就不知道从文件中读取了多少个字符,因为String
通常可以包含任意数量的字符。
在VB.NET中,您可以根据需要执行以下操作之一:
如果长度很重要(例如,您需要从某些数据源中读取一个字节),请考虑使用数组,例如
Dim aSingleByteArray(1) As Byte
或者,您可以使用其中一个 Stream 类。特别是,如果您要从网络套接字或文件中读取数据,请分别考虑使用 NetworkStream 或 FileStream 。 流用于逐字节访问(即原始二进制访问)。 StreamReader 是一个相关的类,它可以简化在基于文本的情况下读取数据,因此,例如,如果您正在阅读文本文件,这可能会很好。否则(如果处理二进制数据),请坚持使用 Stream 类之一。
如果长度无关紧要,您可以使用“普通”String
。也就是说:
Dim aNormalString As String
哪个答案是“正确的”,这实际上取决于为什么在原始VB6代码中声明它的原因。
答案 1 :(得分:2)
看到你正在进行VB6迁移,我肯定会考虑VBFixedStringAttribute
以及Mike Spross列出的其他选项,但是,在这种情况下,因为它是一个单个字符,{{{在这种情况下,1}}也可能是一个选项。
正如其他地方所提到的Char
仅由VBFixedString
和Get
VB I / O API确认。因此,最好的解决方案(除了重写引用“固定长度字符串”的代码之外)就是编写自己的等效Put
。有关详细信息,请参阅this answer。
答案 2 :(得分:2)
固定长度字符串已在VB.NET中弃用,因为有几个更好的选项。
由于您的固定长度字符串只有一个字符长,因此在这种情况下您可以使用Char类型,如Mark建议的那样。
Dim strChar1 As Char
答案 3 :(得分:0)
VBFixedStringAttribute类
<VBFixedString(1)> Dim strChar1 As String