Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当于;变暗为字符串*1“;VB6到VB.NET_Vb.net_String_Vba_Vb6_Vb6 Migration - Fatal编程技术网

相当于;变暗为字符串*1“;VB6到VB.NET

相当于;变暗为字符串*1“;VB6到VB.NET,vb.net,string,vba,vb6,vb6-migration,Vb.net,String,Vba,Vb6,Vb6 Migration,我有一些VB6代码需要迁移到VB.NET,我想询问这行代码,看看是否有办法在.NET中实现它 Dim strChar1 As String * 1 Intellisense一直告诉我应该有语句结尾。这就是所谓的“固定长度”字符串。VB.NET中没有完全相同的版本 编辑:嗯,好吧,有,但我很确定这仅仅是为了让自动迁移工具能够更轻松地将VB6代码转换为VB.NET,而这并不是真正的.NET方式。另请参阅文章中的警告,以获取有关为什么这仍然与VB6中的固定长度字符串不完全相同的详细信息 通常,只有在

我有一些VB6代码需要迁移到VB.NET,我想询问这行代码,看看是否有办法在.NET中实现它

Dim strChar1 As String * 1
Intellisense一直告诉我应该有语句结尾。

这就是所谓的“固定长度”字符串。VB.NET中没有完全相同的版本

编辑:嗯,好吧,有,但我很确定这仅仅是为了让自动迁移工具能够更轻松地将VB6代码转换为VB.NET,而这并不是真正的.NET方式。另请参阅文章中的警告,以获取有关为什么这仍然与VB6中的固定长度字符串不完全相同的详细信息

通常,只有在从文件或通过网络读取固定大小的记录(即解析协议帧中的标题)时,才会在VB6中使用固定长度字符串

例如,您可能有一个包含一组固定长度记录的文件,这些记录的格式均为(整数、1字符串、双精度),您可以在VB6中将其表示为用户定义的类型:

Public Type Record anInteger As Integer aSingleCharacter As String * 1 aDouble As Double End Type 公共类型记录 作为整数的整数 单个字符作为字符串*1 加倍 端型 这样,从包含此格式记录的文件中读取的VB6代码可以读取存储在该文件中的每个固定大小的记录,尤其是对于单个字符,它只能读取1个字节。如果没有
*1
,VB6将不知道从文件中读取多少个字符,因为
字符串通常可以有任意数量的字符

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

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

    Dim aSingleByteArray(1)作为字节

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

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

    将字符串设置为字符串


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

< P>当你正在进行VB6迁移时,我肯定会考虑<代码> VBFixEdTrimeAtgult以及Mike Spross列出的其他选项,但是,在这种情况下,因为它是单个字符,在这种情况下,
Char
也可能是一个选项


如其他地方所述,
VBFixedString
仅由
Get
Put
vbi/oapi确认。因此,最好的解决方案(除了重写引用“固定长度字符串”的代码)是编写自己的
Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString
。有关详细信息,请参阅。

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

因为固定长度的字符串只有一个字符长,所以在本例中可以使用Char类型,正如Mark所建议的那样

Dim strChar1 As Char

VBFixedStringAttribute类


Dim strChar1 As String

您拥有的是一个固定长度的字符串。我们讨论了如何在VB.NET中声明一个。@Jay:我也看到了,但就我个人而言,我会避开VBFixedStringAttribute。这是Microsoft.VisualBasic名称空间中的许多东西之一,它是VB6的继承物,在.NET首次出现时,它使转换到VB.NET变得更容易,但我认为最好避免该名称空间中的大部分内容,而选择等效的“标准”.NET Framework功能。我的意思是,他们甚至保留了旧的VB6错误处理模型,带有
On error
Goto
Resume
,即使异常是处理.NET代码中错误的预期(和更强大的)方法;-)@Mike-我还没有真正研究过VBFixedStringAttribute类,以确定使用它是否是一个坏主意,但我相信这个问题与我链接的问题是重复的。我也认为你的答案比那里找到的更好,所以+1对你来说。(当然,我同意你的观点,在VB.NET应用程序中使用旧的VB6错误处理方式是一个糟糕的选择!)@Mike为什么要避免使用这个名称空间?它只是一个.Net程序集,就像其他程序集一样!它是VB的一部分,没有理由不使用它。它不会消失。但是现在要避免使用Microsoft.VisualBasic.Compatibility程序集。@Chris:True,
Microsoft.VisualBasic.Compatibility
要差得多,但是
Microsoft.VisualBasic
命名空间可能会让人头疼。问题的一部分在于,它的设计工作方式与VB6非常相似,以至于当它实际工作方式不同时,它会变得混乱。例如,他们甚至重新实现了大多数VB6日期和时间函数(如
DateSerial
和friends),尽管.NET framework已经有类来完成所有这些任务。另一个例子:当一半的代码使用旧式的
ErrObject
而另一半使用.NET异常时,例如.Char肯定是最接近的等价物。@Derek:
Char
是否等价取决于上下文。在VB6中,字符串存储为Unicode,但如果您正在读取或写入文件,
String*1
将被视为单个字节(8位),而不是字符(16位),即使您在字符串中放入了Unicode字符。VB6也可以是au