我正在查看一些旧的VB6代码。我是VB的新手,我来自C / Java背景,所以我不理解一些赋值语句。这是一个例子 -
Private Type UGH
Rsp(3) As Byte
ProgramId(7) As Byte
RID(7) As Byte
TID(3) As Byte
FL(39) As Byte
End Type
Private UHeader As UGH
稍后,作业如下 -
With UHeader
StringToByteArray UHeader.ProgramId(), "ABCDPQRS"
我的问题是,为什么在上述作业中使用括号后的括号?对我来说,这似乎是一个函数调用,但它显然不是函数调用。那是什么?
答案 0 :(得分:5)
实际上并不需要它。在没有括号的情况下调用相同的行将完全相同。它被允许的原因是因为它是一个字节数组。
也许重写这样的行会使它更具可读性:
call StringToByteArray(UHeader.ProgramId(), "ABCDPQRS")
但这也是有效的:
call StringToByteArray(UHeader.ProgramId, "ABCDPQRS")
如果StringToByteArray方法是函数而不是子例程,那么你可能会更有意义:
Private Function StringToByteArray(ByVal strValue As String) As Byte()
'conversion code left out
End Function
然后你可以这样称呼它:
UHeader.ProgramId() = StringToByteArray("ABCDPQRS")
或者这个:
UHeader.ProgramId = StringToByteArray("ABCDPQRS")
答案 1 :(得分:1)
本例中的括号用于指定数组。对于Rsp(3) as Byte
,它表示从0到2索引的3个字节的数组。
对于行:StringToByteArray UHeader.ProgramId(), "ABCDPQRS", StringToByteArray
是一个采用字节数组的方法 - 将数组传递给方法时,将其作为array()
传递。
答案 2 :(得分:0)
括号也用于数组语法。
所以说,StringToByteArray UHeader.ProgramId(), "ABCDPQRS"
不是严格意义上的赋值,它是一种方法(子程序或函数)调用。 StringToByteArray
将在程序中的某处定义,它可能需要一个ByRef数组参数,一个字符串参数,它可能会将字符串参数复制到字节缓冲区中。
答案 3 :(得分:0)
UHeader.ProgramId实际上是指向数组的指针。您可以这样做:StringToByteArray UHeader.ProgramID, "ABCDPQRS"
。 VB6中的规则是函数需要对参数列表进行括号化,而Subs需要非括号,除非前面有Call语句,否则它们会这样做。
由于您通过引用传递数组(默认值),因此在子例程中执行的操作将在数组本身上执行。基本上,您正在传递一个指向数组和文字字符串的指针,子程序将使用字符串中的字符填充数组。有点像“非正式”函数调用,如果你愿意的话。