Ape*_*lus 0 .net vb.net vb6-migration
UBound函数在VB.NET中实际做了什么,为什么MSDN文档看起来不准确?
根据MSDN文档(这里)的UBound函数:
返回数组指示维度的最高可用下标.
进一步来说:
指定维度的下标可以包含的最高值.如果Array只有一个元素,则UBound返回0.如果Array没有元素,例如,如果它是零长度字符串,则UBound返回-1.
但是,在我的测试中(以及在文档中找到的一些示例中),UBound函数返回数组的长度而不是最高的可用下标:

同样重要的是要注意,对于包含一个元素的数组,UBound返回1,而不是文档所述的0.
回答答案:
我现在看到,当您在vb.net中声明一个数组时,您声明所需的最高下标而不是C#中数组的长度.
理解这一点,我现在明白为什么UBound为声明的数组返回1而不是0 Dim c(1).因为这个数组的最高下标为1,因此给它2个元素.此外,要声明一个在vb.net中只有一个元素的数组,它应该像这样声明Dim b(0).

Joe*_*Joe 10
文档准确:
你的例子:
Dim a(100,5,4)
Run Code Online (Sandbox Code Playgroud)
是相同的 (*)
Dim a(0 To 100, 0 To 5, 0 To 4)
Run Code Online (Sandbox Code Playgroud)
UBound(a,1) 返回第一个维度的最高可用下标,即100(实际上有101个元素,索引从0到100).
(*)实际上在VB6和VBA中,您可以使用Option Base语句覆盖默认下限.但是如果你不这样做(你不应该这样做),它将默认为0.
我个人总是0 To N在声明VB数组时使用,绝对明确并且不依赖于Option Base设置. a(N)或a(0 To N)声明一个带有N + 1个元素的数组,索引从0到N,后一种语法使这个更清晰恕我直言.
请注意,在VBA/VB6(从中派生VB.NET)中可以使用任何下限,因此您也可以将数组声明为:
Dim a(500 to 600)
Run Code Online (Sandbox Code Playgroud)
如果要编写可以遍历此类数组的代码,则应始终使用:
For nIndex = LBound(a) To UBound(a)
Run Code Online (Sandbox Code Playgroud)
同样重要的是要注意,对于包含一个元素的数组,UBound返回1
不正确 - 以下数组有一个元素,并UBound(a)返回0:
Dim a(0)
Run Code Online (Sandbox Code Playgroud)
要么
Dim a(0 To 0)
Run Code Online (Sandbox Code Playgroud)
阵列
Dim a(1)
Run Code Online (Sandbox Code Playgroud)
是相同的:
Dim a(0 To 1)
Run Code Online (Sandbox Code Playgroud)
并有两个要素a(0)和a(1). LBound返回0并UBound返回1,正如您所期望的那样.
最后一点:UBound(a)将返回-1表示空数组(无元素).AFAIK你不能用VB6/VBA代码创建这样的数组,但你可以从用其他语言编写的代码中返回一个,包括VB.NET