Я пробовал этот код в VB:
Dim a(1) As Byte
Console.WriteLine(a.Length)
Выходной сигнал "2". Кто-нибудь знает, почему?
Я пробовал этот код в VB:
Dim a(1) As Byte
Console.WriteLine(a.Length)
Выходной сигнал "2". Кто-нибудь знает, почему?
Если вы используете языки 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.
С#:
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. Начальный индекс массива VB6 равен 1, если вы не объявляете опцию Base 0. Обычно было циклически проходить массив размера N с помощью For i = 1 To N
. Разработав VB.NET для интерпретации аргумента определения размера массива в качестве верхней границы, а не количества элементов в массиве, старый код VB6, который зацикливается от 1 до N, может быть перенесен непосредственно в VB.NET. Массив в VB.NET будет иметь один дополнительный элемент по сравнению с массивом в VB6 (элемент с индексом 0), но в остальном будет вести себя так же, как в VB6.
Иногда вы увидите, как люди утверждают, что Visual Basic создает "потраченный впустую" элемент. Это верно только при переносе устаревшего кода VB6, который не ожидал элемента с индексом 0. При написании нового кода вам просто нужно запомнить, что означает параметр размера (верхняя граница, а не количество элементов), и соответственно объявить свои массивы. Просто уменьшите ваши параметры размера на один по сравнению с тем, что вы увидите в С#. Полученный массив будет иметь элементы от a(0)
до a(a.Length-1)
, как и массив С#.
Массив начинается с позиции 0. Вы определяете две позиции.
Если вы хотите только 1 позицию, то:
Dim a(0) As Byte
и вы получите a.Length как 1.
Длина измерения Индекс каждого размерность равна 0, что означает от 0 до верхней границы. Следовательно, длина данного размер больше на 1, чем объявленная верхняя граница для этого измерение.
В предыдущих ответах у каждого есть кусочки правильного ответа, но не полный правильный ответ. Когда вы объявляете массив (как с вашим кодом: Dim a (1) As Byte) номер, который вы помещаете в объявление массива (в данном случае 1), НЕ является объявлением количества записей в массив, это объявление верхней границы массива.
Итак, в вашем объявлении вы создаете массив с 2 записями: a (0) и (1)