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?
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?
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)
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.
Wenn Sie sich fragen, wie Sie ein leeres Array initiieren können, lesen Sie zu dieser Antwort
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 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.