Visual Basic 2010中如何在结构内声明固定长度字符串数组?
解决VB 2010中结构内固定长度字符串数组的声明问题
嘿,我来帮你搞定这个结构声明的问题!你之前的代码出错是因为把固定长度字符串的语法和VBFixedArray属性混用了,正确的做法需要分开处理数组的固定大小和每个元素的固定字符串长度,同时还要确保结构的内存布局能被正确计算。
正确的结构声明步骤
首先,你需要导入System.Runtime.InteropServices命名空间,这样才能使用内存布局相关的属性:
Imports System.Runtime.InteropServices
然后,按照以下方式声明你的Vessels结构:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> Structure Vessels ' 3字符固定长度字符串 <VBFixedString(3)> Dim Vsl_Code As String ' 30字符固定长度字符串 <VBFixedString(30)> Dim Vsl_Descr As String ' 包含4个元素的数组,每个元素是8字符固定长度字符串 <VBFixedArray(3)> ' 索引0-3,共4个元素 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim Vsl_IMO() As <VBFixedString(8)> String ' 构造函数:初始化数组,避免空引用并设置默认固定长度 Public Sub New() ReDim Vsl_IMO(3) For i As Integer = 0 To 3 ' 初始化每个元素为8个空格的固定长度字符串 Vsl_IMO(i) = New String(" "c, 8) Next End Sub End Structure
如何获取结构的总长度
要准确计算Vessels类型的内存长度,需要使用Marshal.SizeOf方法,它会根据结构的布局属性计算出正确的大小:
' 创建结构实例 Dim myVessel As New Vessels() ' 获取结构长度 Dim structLength As Integer = Marshal.SizeOf(myVessel) Console.WriteLine($"Vessels结构的总长度为:{structLength}")
为什么你的原代码不行
你之前写的<VBFixedArray(3)> Dim Vsl_IMO As string * 8是错误的:
string * 8是VB6风格的固定长度字符串语法,但在.NET结构中结合数组使用时,不能直接这么写- 需要用
VBFixedArray(3)指定数组的元素数量(4个),同时给数组的每个元素加上VBFixedString(8)属性来限定单个字符串的长度 - 加上
StructLayout和MarshalAs属性是为了确保.NET能正确将结构映射到固定的内存布局,这样才能准确计算结构长度
内容的提问来源于stack exchange,提问作者Theophilos Kairis
相关产品推荐
相关产品推荐

