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

时间:2015-04-02 16:49:38

标签: .net vb.net vb6-migration

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

根据MSDN文档(here)UBound函数:

  

返回指定数组维度的最高可用下标。

更具体地说:

  

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

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

Image from MSDN documentation on the UBound function

同样重要的是要注意,对于包含一个元素的数组,UBound返回1,而不是文档所述的0。


回答:

我现在看到,当您在vb.net中声明一个数组时,您声明所需的最高下标而不是C#中数组的长度。

理解这一点,我现在明白为什么UBound为声明为Dim c(1)的数组返回1而不是0。因为这个数组的最高下标为1,因此给它2个元素。此外,要在vb.net中声明只有一个元素的数组,它应该声明为Dim b(0)

enter image description here

1 个答案:

答案 0 :(得分:10)

文档准确无误:

你的例子:

Dim a(100,5,4)

与(*)

相同
Dim a(0 To 100, 0 To 5, 0 To 4)

UBound(a,1)返回第一个维度的最高可用下标,即100(实际上有101个元素,索引从0到100)。

(*)实际上在VB6和VBA中,您可以使用Option Base语句覆盖默认的下限。但是如果你不这样做(你不应该这样做!),它将默认为0。

我个人总是在声明VB数组时使用0 To N,绝对明确并且不依赖于Option Base设置。 a(N)a(0 To N)声明一个带有N + 1个元素的数组,索引从0到N,后一种语法使这个更清晰恕我直言。

请注意,在VBA / VB6(从中派生VB.NET)中可以使用任何下限,因此您也可以将数组声明为:

Dim a(500 to 600)

如果要编写可以迭代此类数组的代码,则应始终使用:

For nIndex = LBound(a) To UBound(a)
  

同样重要的是要注意,对于包含一个元素的数组,UBound返回1

不正确 - 以下数组有一个元素,UBound(a)返回0:

Dim a(0) 

Dim a(0 To 0)

数组

Dim a(1)

与:

相同
Dim a(0 To 1)

并且有两个元素a(0)a(1)。 <{1}}返回0,LBound返回1,正如您所期望的那样。

最后一点:UBound(a)将返回-1表示空数组(无元素)。 AFAIK你不能用VB6 / VBA代码创建这样的数组,但你可以从用其他语言编写的代码中返回一个,包括VB.NET