UBound函数实际上在VB.NET中做了什么,为什么MSDN文档看起来不准确?
根据MSDN文档(here)UBound函数:
返回指定数组维度的最高可用下标。
更具体地说:
指定维度的下标可包含的最高值。如果Array只有一个元素,则UBound返回0.如果Array没有元素,例如,如果它是零长度字符串,则UBound返回-1。
但是,在我的测试中(以及在文档中找到的一些示例中),UBound函数返回数组的长度,而不是最高可用下标:< / p>
同样重要的是要注意,对于包含一个元素的数组,UBound返回1,而不是文档所述的0。
回答:
我现在看到,当您在vb.net中声明一个数组时,您声明所需的最高下标而不是C#中数组的长度。
理解这一点,我现在明白为什么UBound为声明为Dim c(1)
的数组返回1而不是0。因为这个数组的最高下标为1,因此给它2个元素。此外,要在vb.net中声明只有一个元素的数组,它应该声明为Dim b(0)
。
答案 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