Подтвердить что ты не робот

Размер массива в Visual Basic?

Я пробовал этот код в VB:

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

Выходной сигнал "2". Кто-нибудь знает, почему?

4b9b3361

Ответ 1

Если вы используете языки C/С++/С#, вы используете это, когда объявляете массив для инициализации массива с числом элементов в массиве.

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

объявит массив байтов с 1 элементом (upperBound = 0)

В VB поведение различно, где при объявлении массива параметр, используемый при инициализации, представляет массив UpperBound.

VB.NET: Dim a(1) As Byte

объявит массив байтов с 2 элементами (upperBound = 1)

Ответ 2

В 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), как и массив С#.

Ответ 3

Массив начинается с позиции 0. Вы определяете две позиции.

Если вы хотите только 1 позицию, то:

Dim a(0) As Byte

и вы получите a.Length как 1.

Ответ 4

Длина измерения Индекс каждого размерность равна 0, что означает от 0 до верхней границы. Следовательно, длина данного размер больше на 1, чем объявленная верхняя граница для этого измерение.

Размер массива в Visual Basic

Ответ 5

В предыдущих ответах у каждого есть кусочки правильного ответа, но не полный правильный ответ. Когда вы объявляете массив (как с вашим кодом: Dim a (1) As Byte) номер, который вы помещаете в объявление массива (в данном случае 1), НЕ является объявлением количества записей в массив, это объявление верхней границы массива.

Итак, в вашем объявлении вы создаете массив с 2 записями: a (0) и (1)