VB.NET UBound功能实际上做了什么,为什么MSDN文档看起来不准确?

Ape*_*lus 0 .net vb.net vb6-migration

UBound函数在VB.NET中实际做了什么,为什么MSDN文档看起来不准确?

根据MSDN文档(这里)的UBound函数:

返回数组指示维度的最高可用下标.

进一步来说:

指定维度的下标可以包含的最高值.如果Array只有一个元素,则UBound返回0.如果Array没有元素,例如,如果它是零长度字符串,则UBound返回-1.

但是,在我的测试中(以及在文档中找到的一些示例中),UBound函数返回数组的长度而不是最高的可用下标:

来自MSDN文档的关于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