Visual Basic中的数组大小?

时间:2009-02-03 06:59:12

标签: vb.net arrays

我在VB中试过这段代码:

Dim a(1) As Byte
Console.WriteLine(a.Length)

输出为“2”。任何人都知道为什么?

5 个答案:

答案 0 :(得分:29)

如果您习惯使用C / C ++ / C#语言,那么在声明一个数组以使用数组中的元素数对其进行初始化时,就会使用它。

C# : byte a[] = new byte[1]

将声明一个包含1个元素的字节数组(upperBound = 0)

VB中的行为不同,在声明数组时,初始化中使用的参数表示数组的 UpperBound

VB.NET: Dim a(1) As Byte

将声明一个包含2个元素的字节数组(upperBound = 1)

答案 1 :(得分:16)

在Visual Basic中,使用数组的上限声明数组的大小,其中大多数语言通过指定元素数来声明数组的大小数组。如果您不知道这一点,那么您的Visual Basic数组最终比预期长1个元素:

VB.NET:

 Dim a(1) as Byte ' under the hood, translated to byte[2] 
 Console.WriteLine("{0}", a.Length) ' output 2

 a(0) = 7 ' No error, element exists
 a(1) = 7 ' No error, element exists, array length is 2
 a(a.Length) = 7  ' error: Index was outside the bounds of the array.

C#:

 byte[] a = new byte[1];
 Console.WriteLine("{0}", a.Length); // output 1

 a[0] = 7 // No error, element exists
 a[1] = 7 // error:  Index was outside of bounds of the array. (because array length is 1)
 a[a.Length] = 7; // error: Index was outside the bounds of the array.

Microsoft设计VB.NET以根据上限而非数组长度调整数组大小的原因是为了使代码从VB6移植到VB.NET变得更容易。除非您声明Option Base 0,否则VB6数组的初始索引为1.通常使用For i = 1 To N循环大小为N的数组。通过设计VB.NET将数组的大小参数解释为上限而不是数组中元素的数量,从1到N循环的旧VB6代码可以直接移植到VB.NET。与VB6中的数组(索引0处的元素)相比,VB.NET中的数组将有一个额外的元素,但在其他方面的行为与在VB6中的行为相同。

您有时会看到有人声称Visual Basic会创建一个“浪费”的元素。这只适用于移植传统的VB6代码时,它不会期望索引为0的元素。在编写新代码时,您只需要记住大小参数的含义(上限,而不是元素数),并相应地声明您的数组。与您在C#中看到的相比,只需将您的大小调整参数减少一个。生成的数组将包含从a(0)a(a.Length-1)的元素,就像C#数组一样。

答案 2 :(得分:8)

数组从位置0开始。您正在定义两个位置。

如果您只想要1个职位,那么:

Dim a(0) As Byte

你将获得a.Length为1。

答案 3 :(得分:8)

  

尺寸长度每个的索引   dimension是从0开始的,这意味着它   范围从0到其上限。   因此,给定的长度   尺寸大于1   宣布上限   尺寸。

Array Size in Visual Basic

答案 4 :(得分:5)

之前的答案都有正确答案,但不是完整正确的答案。 当你声明一个数组时(和你的代码一样:Dim a(1)As Byte)你在数组声明中放入的数字(在这种情况下,1)不是多少个条目的声明数组,它是数组上边界的声明。

因此,在您的声明中,您正在创建一个包含2个条目的数组:a(0)和a(1)