29 Stimmen

Größe eines Arrays in Visual Basic?

Ich habe versucht, diesen Code in VB:

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

Die Ausgabe ist "2". Hat jemand eine Idee, warum?

35voto

AlexDrenea Punkte 7865

Wenn Sie mit den Sprachen C/C++/C# vertraut sind, sind Sie es gewohnt, bei der Deklaration eines Arrays dieses mit der Anzahl der Elemente in dem Array.

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

wird ein Byte-Array mit 1 Element deklariert (upperBound = 0)

Das Verhalten ist anders in VB, wo bei der Deklaration eines Arrays der in der Initialisierung verwendete Parameter die UpperBound des Arrays.

VB.NET: Dim a(1) As Byte

wird ein Byte-Array mit 2 Elementen deklariert (upperBound = 1)

25voto

Michael Buen Punkte 37103

In Visual Basic wird die Größe eines Arrays mit der Arrayeigenschaft obere Schranke Die meisten Sprachen deklarieren die Größe eines Arrays durch Angabe der Anzahl der Elemente in der Anordnung. Wenn Sie sich dessen nicht bewusst sind, sind Ihre Visual Basic-Arrays am Ende um 1 Element länger als erwartet:

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.

Der Grund, warum Microsoft VB.NET so konzipiert hat, dass die Größe von Arrays auf der oberen Grenze basiert und nicht auf der Array-Länge, ist, dass es einfacher ist, Code von VB6 nach VB.NET zu portieren. Der Anfangsindex eines VB6-Arrays ist 1, es sei denn, Sie deklarieren Option Base 0. Es war üblich, eine Schleife durch ein Array der Größe N mit For i = 1 To N . Indem VB.NET das Größenargument eines Arrays als Obergrenze und nicht als Anzahl der Elemente im Array interpretiert, kann alter VB6-Code, der in einer Schleife von 1 bis N läuft, direkt nach VB.NET portiert werden. Das Array in VB.NET hat ein zusätzliches Element im Vergleich zu dem Array in VB6 (das Element bei Index 0), verhält sich aber ansonsten wie in VB6.

Manchmal wird behauptet, dass Visual Basic ein "verschwendetes" Element erzeugt. Dies trifft nur zu, wenn man alten VB6-Code portiert, der kein Element bei Index 0 erwartet hat. Wenn Sie neuen Code schreiben, müssen Sie sich nur daran erinnern, was der Sizing-Parameter bedeutet (obere Grenze, nicht Elementanzahl), und Ihre Arrays entsprechend deklarieren. Verringern Sie einfach Ihre Größenparameter um eins im Vergleich zu dem, was Sie in C# sehen würden. Das resultierende Array hat Elemente von a(0) à a(a.Length-1) genau wie ein C#-Array.

1 Stimmen

Wenn Sie sich fragen, wie Sie ein leeres Array initiieren können, lesen Sie zu dieser Antwort

8voto

SMB Punkte 603

Array beginnt bei Position 0. Sie definieren zwei Positionen.

Wenn Sie nur 1 Position wünschen, dann:

Dim a(0) As Byte

und Sie erhalten a.Length als 1.

8voto

Nescio Punkte 26799

Abmessung Länge Der Index der einzelnen Dimension ist 0-basiert, d. h. er reicht von 0 bis zu seiner oberen Grenze. Daher ist die Länge einer bestimmten Dimension um 1 größer als die deklarierte obere Grenze für diese Dimension.

Array-Größe in Visual Basic

5voto

Taegost Punkte 1150

Die vorherigen Antworten enthalten jeweils Teile der richtigen Antwort, aber nicht die vollständige richtige Antwort. Wenn Sie ein Array deklarieren (wie bei Ihrem Code: Dim a(1) As Byte), ist die Zahl, die Sie in der Array-Deklaration angeben (in diesem Fall 1), NICHT eine Deklaration von wie viele Einträge im Array, ist es eine Deklaration des obere Begrenzung des Arrays.

In Ihrer Deklaration erstellen Sie also ein Array mit 2 Einträgen: a(0) und a(1)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X