Taille du tableau dans Visual Basic?

j'ai essayé ce code en VB:

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

La sortie est "2". Quelqu'un une idée de pourquoi?

19
demandé sur Andrei 2009-02-03 09:59:12

5 réponses

si vous êtes utilisé pour les langages C/C++/C#, vous êtes utilisé pour déclarer un tableau pour l'initialiser avec le nombre d'éléments dans le tableau.

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

déclarer un tableau d'octets avec 1 élément (upperBound = 0)

le comportement est différent dans VB où, lors de la déclaration d'un tableau le paramètre utilisé dans l'initialisation représente le UpperBound de la matrice.

VB.NET: Dim a(1) As Byte

déclarer un tableau d'octets avec 2 éléments (upperBound = 1)

28
répondu AlexDrenea 2009-02-03 08:07:40

dans Visual Basic, la taille d'un tableau est déclarée aveclimite supérieure, où la plupart des langues déclarer la taille d'un tableau en spécifiant l' nombre d'éléments dans le tableau. Si vous n'êtes pas au courant de cela, alors vos tableaux Visual Basic finissent par être 1 élément de plus que vous ne l'espériez:

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 raison pour laquelle Microsoft a conçu VB.NET jusqu'à la taille des tableaux basés sur la limite supérieure plutôt que la longueur de tableau est de rendre plus facile de code de port de VB6 à VB.NET. L'index initial D'un tableau VB6 est 1, sauf si vous déclarez L'Option Base 0. Il était courant de faire une boucle à travers un tableau de taille N en utilisant For i = 1 To N. En concevant VB.NET pour interpréter l'argument de dimensionnement d'un tableau comme une limite supérieure plutôt que le nombre d'éléments dans le tableau, l'ancien code VB6 qui passait de 1 À N pouvait être porté directement à VB.NET. Le tableau dans VB.NET aura un élément supplémentaire par rapport à ce que le tableau avait dans VB6 (l'élément à l'index 0), mais se comporte autrement comme il l'a fait dans VB6.

vous verrez parfois des gens prétendre que Visual Basic crée un élément" gaspillé". Ceci n'est vrai que lorsque vous transférez du code VB6 legacy qui ne s'attendait pas à un élément à l'index 0. Lorsque vous écrivez un nouveau code, vous devez juste vous rappeler ce que le paramètre de dimensionnement signifie (limite supérieure, pas le nombre d'éléments), et déclarer vos tableaux en conséquence. Il suffit de réduire vos paramètres de dimensionnement d'un par rapport à ce que vous verriez dans C#. Le tableau résultant aura des éléments de a(0)a(a.Length-1), comme un tableau C#.

15
répondu Michael Buen 2014-11-17 18:32:24

Le tableau commence en position 0. Vous définissez deux positions.

Si vous voulez seulement 1 position, puis:

Dim a(0) As Byte

et vous obtiendrez une.La longueur est 1.

8
répondu SMB 2009-02-03 07:06:25

Longueur De La Dimension l'indice de chaque la dimension est basée sur 0, ce qui signifie qu'il varie de 0 à sa limite supérieure. Par conséquent, la longueur d'un la dimension est plus grande de 1 que la limite supérieure déclarée dimension.

Taille du tableau dans Visual Basic

8
répondu Nescio 2009-02-03 07:06:44

les réponses précédentes ont chacune des parties de la bonne réponse, mais pas la bonne réponse complète. Lorsque vous déclarez un tableau (comme avec votre code: Dim a(1) comme Byte) le nombre que vous mettez dans la déclaration du tableau (dans ce cas, 1) N'est pas une déclaration de combien les entrées dans le tableau, c'est une déclaration de l' limite supérieure de la matrice.

donc, dans votre déclaration, vous créez un tableau avec 2 entrées: a(0) et a(1)

5
répondu Taegost 2013-11-22 14:26:46