我在VB中尝试过这段代码:
Dim a(1) As Byte Console.WriteLine(a.Length)
输出为"2".任何人都知道为什么?
如果您习惯使用C/C++/C#语言,那么在声明数组时会使用它来使用数组中的元素数来初始化它.
C# : byte a[] = new byte[1]
将声明一个包含1个元素的字节数组(upperBound = 0)
VB中的行为是不同的,其中,在声明数组时,初始化中使用的参数表示数组的UpperBound.
VB.NET: Dim a(1) As Byte
将声明一个包含2个元素的字节数组(upperBound = 1)
在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.
微软设计VB.NET以基于上限而不是数组长度来调整数组大小的原因是为了更容易将代码从VB6移植到VB.NET.除非您声明Option Base 0,否则VB6数组的初始索引为1.通常使用大小为N的数组循环For i = 1 To 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#阵列.
数组从位置0开始.您正在定义两个位置.
如果您只想要1个职位,那么:
Dim a(0) As Byte
你会得到a.Length为1.
维度长度每个维度的索引从0开始,这意味着它的范围从0到其上限.因此,给定维度的长度比该维度的声明上限大1.
Visual Basic中的数组大小
之前的答案各有一些正确的答案,但不是完整正确的答案.当你声明一个数组时(和你的代码一样:Dim a(1)As Byte)你在数组声明中放入的数字(在本例中为1)不是数组中有多少条目的声明,它是一个声明数组的上边界.
因此,在您的声明中,您将创建一个包含2个条目的数组:a(0)和a(1)