我在VB中试过这段代码:
Dim a(1) As Byte
Console.WriteLine(a.Length)
输出为“2”。任何人都知道为什么?
答案 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 宣布上限 尺寸。
答案 4 :(得分:5)
之前的答案都有正确答案,但不是完整正确的答案。 当你声明一个数组时(和你的代码一样:Dim a(1)As Byte)你在数组声明中放入的数字(在这种情况下,1)不是多少个条目的声明数组,它是数组上边界的声明。
因此,在您的声明中,您正在创建一个包含2个条目的数组:a(0)和a(1)