【问题标题】:Equivalent of "Dim As String * 1" VB6 to VB.NET相当于“Dim As String * 1”VB6 到 VB.NET
【发布时间】:2012-03-06 06:32:25
【问题描述】:

我有一些VB6代码需要迁移到VB.NET,想查询一下这行代码,看看有没有办法在.NET中实现

Dim strChar1 As String * 1

Intellisense 不断告诉我预期语句结束。

【问题讨论】:

  • 你有一个固定长度的字符串。如何在 VB.NET 中声明一个被讨论here
  • @Jay:我也看到了,但我个人会回避 VBFixedStringAttribute。它是 Microsoft.VisualBasic 命名空间中的许多东西之一,它是 VB6 的继承,以便在 .NET 首次出现时更容易转换到 VB.NET,但恕我直言,最好避免该命名空间中的大部分内容,而是选择等效的“标准”.NET Framework 功能。我的意思是,他们甚至使用 On ErrorGotoResume 保留旧的 VB6 错误处理模型,即使异常是处理 .NET 代码中错误的预期(并且更强大)方式;-)跨度>
  • @Mike - 我还没有真正研究过 VBFixedStringAttribute 类以确定使用它是否是一个坏主意,但我相信这个问题是我所链接的问题的欺骗。我也认为你的答案比那里找到的更好,所以给你+1。 (当然我同意你的观点,在 VB.NET 应用程序中使用旧的 VB6 错误处理风格是一个糟糕的选择!)
  • @Mike 为什么要避开那个命名空间?它只是一个 .Net 程序集,就像任何其他程序一样!它是 VB 的一部分,没有理由不使用它。它不会消失。不过,现在要避免使用 Microsoft.VisualBasic.Compatibility 程序集。
  • @Chris:的确,Microsoft.VisualBasic.Compatibility 更糟糕,但Microsoft.VisualBasic 命名空间可能会让人头疼。部分问题在于它被设计为与 VB6 的工作方式非常相似,以至于当它实际上不以相同的方式工作时会让人感到困惑。例如,他们甚至重新实现了大多数 VB6 日期和时间函数(如 DateSerial 和朋友),即使 .NET 框架已经有类来完成所有这些事情。另一个例子:例如,当一半代码使用旧式 ErrObject 而一半使用 .NET 异常时,会让人感到困惑。

标签: vb.net string vba vb6 vb6-migration


【解决方案1】:

这就是所谓的“固定长度”字符串。在 VB.NET 中没有完全等价的。

编辑:嗯,好的,有 VBFixedStringAttribute,但我很确定它的存在只是为了让自动迁移工具可以更轻松地将 VB6 代码转换为 VB .NET 为您服务,它并不是真正的“.NET 方式”做事。另请参阅文章中的警告,了解为什么这仍然与 VB6 中的固定长度字符串不完全相同。

一般来说,固定长度字符串仅在 VB6 中用于从文件或通过网络读取固定大小的记录(即解析协议帧中的标头)。

例如,您可能有一个包含一组固定长度记录的文件,这些记录的格式都为 (integer, 1-character-string, double),您可以在 VB6 中表示作为用户定义的类型:

公共类型记录 anInteger 作为整数 aSingleCharacter 作为字符串 * 1 a双倍 结束类型

这样,从包含这种格式记录的文件中读取的 VB6 代码可以读取文件中存储的每个固定大小的记录,特别是对于aSingleCharacter,它只会读取 1 个字节。如果没有* 1,VB6 将不知道从文件中读取多少字符,因为String 通常可以包含任意数量的字符。

在 VB.NET 中,您可以根据需要执行以下操作之一:

  • 如果长度很重要(例如,您需要从某个数据源中读取一个字节),请考虑改用数组,例如

    Dim aSingleByteArray(1) As Byte

  • 或者,您可以使用 Stream 类之一。特别是,如果您正在从网络套接字或文件读取数据,请考虑分别使用 NetworkStreamFileStreamStream 用于逐字节访问(即原始二进制访问)。 StreamReader 是一个相关的类,它简化了基于文本的数据读取,例如,如果您正在读取文本文件,这可能会很好。否则(如果处理二进制数据),请坚持使用 Stream 类之一。

  • 如果长度无关紧要,您可以使用“普通”String。也就是说:

    Dim aNormalString As String

哪个答案是“正确的”实际上取决于为什么它在原始 VB6 代码中以这种方式声明。

【讨论】:

    【解决方案2】:

    固定长度的字符串在 VB.NET 中已被弃用,因为有几个更好的选择。

    由于您的固定长度字符串只有一个字符长,因此您可以在这种情况下使用 Char 类型,正如 Mark 建议的那样。

    Dim strChar1 As Char
    

    【讨论】:

      【解决方案3】:

      鉴于您正在进行 VB6 迁移,我肯定会考虑 VBFixedStringAttribute 以及 Mike Spros 列出的其他选项,但在这种情况下,因为它是单个字符,Char 可能在这种情况下也是一种选择。

      正如在别处提到的VBFixedString 仅由GetPut VB I/O API 确认。所以最好的解决方案(除了重写引用“固定长度字符串”的代码之外)是编写自己的 Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString 等效项。详情请见this answer

      【讨论】:

      • Char 肯定是最接近的等价物。
      • @Derek:Char 是否等价取决于上下文。在 VB6 中,字符串存储为 Unicode,但如果您正在读取或写入文件,String * 1 将被视为单个字节(8 位),而不是字符(16 位),即使您放置了 Unicode 字符在字符串中。当您调用使用 String 参数声明的外部函数(即 Windows API 调用)时,VB6 还会自动将字符串参数转换为 ASCII。关于这一点,出于同样的原因,VB.NET 的 String 数据类型(在我的回答中建议)在技术上也不等同。这取决于 OP 用它做什么。
      【解决方案4】:

      VBFixedStringAttribute 类

      <VBFixedString(1)> Dim strChar1 As String

      【讨论】:

      • 这个问题是 7 年前回答的。如果您认为您的答案比接受的答案更好,请添加额外的信息或解释。
      • 我没有更多关于如何设置变量来修复长度字符串的信息。
      【解决方案5】:

      虽然这个问题在很久以前就被问过了,但 VB.NET 实际上有一个原生的固定长度字符串 -- Public fxdString As Char() 'declare 10-char fixed array。使用标量执行此操作实际上会创建 VB6 样式的静态数组。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      • 有关 VBFixedArray 的文档比较:docs.microsoft.com/en-us/dotnet/api/…
      猜你喜欢
      • 2010-10-06
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多