代码之家  ›  专栏  ›  技术社区  ›  martin

Visual Basic中数组的大小?

  •  19
  • martin  · 技术社区  · 17 年前

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

    输出为“2”。有人知道为什么吗?

    5 回复  |  直到 14 年前
        1
  •  30
  •   AlexDrenea    17 年前

    如果您习惯于C/C++ +C语言,则在声明数组时用它来初始化它。 元素数

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

    将声明具有1个元素的字节数组(上界=0)

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

    VB.NET: Dim a(1) As Byte
    

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

        2
  •  16
  •   Jaymin    6 年前

    上界 ,其中大多数语言通过指定 元素数

    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更加容易。除非声明选项基0,否则VB6数组的初始索引为1。使用 For i = 1 To N . 通过将VB.NET设计为将数组的大小参数解释为上界而不是数组中的元素数,可以将从1循环到N的旧VB6代码直接移植到VB.NET。NET中的数组将比VB6中的数组(索引0处的元素)多出一个元素,但在其他方面的行为与VB6中相同。

    你有时会看到人们声称Visual Basic创建了一个“wasted”元素。只有在移植旧的VB6代码时才是这样,因为该代码在索引0处不需要元素。在编写新代码时,只需记住size参数的含义(上界,而不是元素计数),然后相应地声明数组。只需将您的尺寸参数与在C#中看到的尺寸参数减少一个。结果数组将包含 a(0) a(a.Length-1) ,就像一个C数组。

        3
  •  8
  •   SMB    17 年前

    如果你只想要一个位置,那么:

    Dim a(0) As Byte
    

    你会得到1的长度。

        4
  •  8
  •   Nescio    17 年前

    每个的索引 维度是基于0的,这意味着 因此,给定的 维度大于1 宣布为上限

    Array Size in Visual Basic

        5
  •  5
  •   Taegost Alok Pathak    12 年前

    前面的答案都有部分正确答案,但没有完整的正确答案。 当您声明一个数组(就像您的代码:Dim a(1)作为字节)时,您在数组声明中放入的数字(在本例中是1)不是 在数组中,它是 上边界

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