He probado este código en VB:Tamaño de la matriz en Visual Basic?
Dim a(1) As Byte
Console.WriteLine(a.Length)
La salida es "2". Alguien tiene alguna idea de por qué?
He probado este código en VB:Tamaño de la matriz en Visual Basic?
Dim a(1) As Byte
Console.WriteLine(a.Length)
La salida es "2". Alguien tiene alguna idea de por qué?
La matriz comienza en la posición 0. Usted está definiendo dos posiciones.
Si desea que sólo 1 posición, entonces:
Dim a(0) As Byte
y obtendrá como a.length 1.
dimensión de longitud El índice de cada dimensión se basa -0 , lo que significa que varía desde 0 hasta 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 .
Si está acostumbrado a/C++/C# C idiomas que se utilizan que cuando se declara una matriz para inicializar con el número de elementos de la matriz.
C# : byte a[] = new byte[1]
declarará una matriz de bytes con 1 elemento (límite superior = 0)
el comportamiento es diferente en VB donde, cuando se declara un array el parámetro utilizado en la inicialización representa la límite superior de la matriz.
VB.NET: Dim a(1) As Byte
declarará una matriz de bytes con 2 elementos (límite superior = 1)
En Visual Basic, el tamaño de una matriz se declara con de la matriz límite superior, en donde la mayoría de los idiomas declaran el tamaño de una matriz especificando el número de elementos en la matriz. Si usted no es consciente de esto, entonces las matrices de Visual Basic terminan siendo 1 el elemento más largo 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.
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.
La razón Por qué Microsoft diseñó VB.NET para dimensionar arreglos basados 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.
En ocasiones, 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#.
Las respuestas anteriores tienen partes de la respuesta correcta, pero no la respuesta correcta completa. Cuando declara una matriz (Al igual que con su código: Dim a (1) Como Byte) el número que coloca en la declaración de matriz (en este caso, 1) NO es una declaración de cuántas entradas en la matriz, es una declaración del límite superior de la matriz.
Por lo tanto, en su declaración, está creando una matriz con 2 entradas: a (0) y a (1)