visual ubound net matrices initialize how dinamico array vb.net arrays

vb.net - ubound - Tamaño de la matriz en Visual Basic?



vb6 array (5)

He intentado este código en VB:

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

La salida es "2". Alguien tiene alguna idea de por qué?


Longitud de la dimensión El índice de cada dimensión está basado en 0, lo que significa que va de 0 a su límite superior. Por lo tanto, la longitud de una dimensión dada es mayor en 1 que el límite superior declarado para esa dimensión.

Tamaño de matriz en Visual Basic


Array comienza desde la posición 0. Estás definiendo dos posiciones.

Si solo quieres 1 posición, entonces:

Dim a(0) As Byte

y obtendrás a.Longitud como 1.


Si está acostumbrado a los lenguajes C / C ++ / C #, lo utiliza al declarar una matriz para inicializarla con la cantidad de elementos en la matriz.

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

declarará una matriz de bytes con 1 elemento (upperBound = 0)

El comportamiento es diferente en VB donde, al declarar una matriz, el parámetro utilizado en la inicialización representa el UpperBound de la matriz.

VB.NET: Dim a(1) As Byte

declarará una matriz de bytes con 2 elementos (upperBound = 1)


Las respuestas anteriores tienen partes de la respuesta correcta, pero no la respuesta correcta completa. Cuando declaras una matriz (Al igual que con tu código: Dim a (1) Como Byte) el número que colocaste en la declaración de la matriz (en este caso, 1) NO es una declaración de cuántas entradas hay en la matriz, es una declaración del límite superior de la matriz.

Entonces, en su declaración, está creando una matriz con 2 entradas: a (0) y a (1)


En Visual Basic, el tamaño de una matriz se declara con el límite superior de la matriz, donde la mayoría de los lenguajes declaran el tamaño de una matriz al especificar el número de elementos en la matriz. Si no está enterado de esto, sus matrices de Visual Basic terminan siendo 1 elemento más de lo esperado:

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.

DO#:

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.

La razón por la cual Microsoft diseñó VB.NET para dimensionar matrices basadas en el límite superior en lugar de la longitud de la matriz es para facilitar el código de puerto de VB6 a VB.NET. El índice inicial de una matriz VB6 es 1, a menos que declare la opción Base 0. Era común recorrer una matriz de tamaño N usando For i = 1 To N Al diseñar VB.NET para interpretar el argumento de tamaño de una matriz como un límite superior en lugar de la cantidad de elementos en la matriz, el antiguo código VB6 que se enlazó de 1 a N podría ser portado directamente a VB.NET. La matriz en VB.NET tendrá un elemento adicional en comparación con lo que la matriz tenía en VB6 (el elemento en el índice 0), pero de lo contrario se comporta como lo hizo en VB6.

A veces verá que las personas afirman que Visual Basic crea un elemento "desperdiciado". Esto solo es cierto cuando se transfiere el código VB6 heredado que no esperaba un elemento en el índice 0. Cuando se escribe código nuevo, solo tiene que recordar lo que significa el parámetro de dimensionamiento (límite superior, no conteo de elementos) y declarar sus matrices en consecuencia. Simplemente reduzca sus parámetros de tamaño en uno en comparación con lo que vería en C #. La matriz resultante tendrá elementos de a(0) a a(a.Length-1) , al igual que una matriz de C #.