Was bedeutet das VB.NET UBound-Funktion EIGENTLICH tun, und warum tut sich die MSDN-Dokumentation zu sein scheinen ungenau?
Was bedeutet die UBound-Funktion eigentlich tun VB.NET und warum nicht in der MSDN-Dokumentation zu sein scheinen korrekt?
Laut der MSDN-Dokumentation (hier) die UBound-Funktion:
Gibt den höchsten verfügbaren index für die angegebene dimension eines Arrays.
Genauer gesagt:
Den höchsten Wert, den der index für die angegebene dimension enthalten kann. Wenn das Array hat nur ein element, UBound gibt 0 zurück. Wenn das Array hat keine Elemente, zum Beispiel, wenn es ist eine Zeichenfolge der Länge null, UBound gibt den Wert -1 zurück.
Aber in meinen Tests die (und einige Beispiele finden Sie in der Dokumentation) die UBound-Funktion gibt den Länge eines Arrays statt der höchsten verfügbaren index:
Es ist auch wichtig zu beachten, dass UBound gibt 1 zurück, für ein Array mit einem element, das nicht 0, wie in der Dokumentation dargelegt.
In der Antwort auf eine Antwort:
Ich sehe jetzt, dass, wenn Sie ein array deklarieren und in vb.net erklären Sie die höchste gewünschte index NICHT die Länge des Arrays, wie in C#.
Verständnis, dass, jetzt verstehe ich, warum UBound wurde wieder 1 statt 0 für ein array deklariert Dim c(1)
. Da dieser array die höchste Feldindex 1 damit 2 Elemente. Weiter zu erklären, ein array mit nur einem element in vb.net es sollte erklärt werden, wie diese Dim b(0)
.
- Deine arrays sind wahrscheinlich beginnend bei index 1 statt bei index 0. Versuchen Sie tatsächlich Zugriff auf die Indizes, um sicher zu sein, dann versuchen Sie
Dim a(0 to 99, 0 to 4, 0 to 3) as Byte
. - UBound ist ein wapped-Methode von Array.GetUpperBound was gibt "ist der index des letzten Elements der angegebenen dimension in dem array".
- Deinen screenshot mit dem Betreff "Antwort auf eine Antwort" ist falsch - code-Sie müssen angeben, dass ein index für jede dimension des Arrays, z.B. ersetzen
a(UBound(a,1))
durcha(UBound(a,1), UBound(a,2), UBound(a,3))
- Ihre
Dim b(1) As Byte
ist nicht ein array mit einem element. Es ist ein array mit 2 Elementen (Indizes 0 und 1). In VB, wenn Sie ein array deklarieren, geben Sie die Obere Grenze, nicht die Länge. - Ich aktualisierte den screenshot mit genauen code. Danke für die Hilfe mich klar, mein Verständnis von UBound und Arrays in VB.NET. Ich muss sagen, dass ich lieber das Verhalten der arrays im C-Familie von Sprachen mit denen ich gearbeitet habe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Dokumentation ist präzise:
Deinem Beispiel:
ist das gleiche wie (*)
UBound(a,1)
gibt den höchsten verfügbaren index für die erste dimension, die sich 100 (es sind wirklich 101 Elemente, indiziert von 0 bis 100).(*) Eigentlich in VB6 und VBA Sie können den Standardwert überschreiben, untere Schranke mit der Option Base-Anweisung. Aber wenn Sie dies nicht tun (und die sollte man nicht!), es wird standardmäßig auf 0.
Persönlich verwende ich immer
0 To N
bei der Deklaration von VB-arrays, absolut explizit und nicht darauf zu verlassen, die Option Base-Einstellung.a(N)
odera(0 To N)
deklarieren Sie ein array mit N+1 Elementen, indiziert von 0 Bis N, und die diese syntax macht diese übersichtlicher IMHO.Beachten Sie, dass in VBA/VB6 (von denen VB.NET abgeleitet wurde) ist es möglich, beliebige untere Schranke, so können Sie auch ein array deklarieren, wie, sagen wir:
Wenn Sie wollen code schreiben, Durchlaufen solche arrays, sollten Sie immer verwenden:
Nicht wahr - das folgende array hat ein element, und
UBound(a)
0 zurück:oder
Array
ist das gleiche wie:
und hat zwei Elemente
a(0)
unda(1)
.LBound
0 zurück undUBound
gibt 1 zurück, wie man erwarten würde.Einen letzten Punkt: UBound(a) return -1 bei leerem array (keine Elemente). AFAIK kann man nicht schaffen, wie ein array mit VB6/VBA-code, aber Sie können Holen Sie sich zurück von code in anderen Sprachen geschrieben wurden, einschließlich VB.NET
Option Base 1
war eine alte VB6-Sache, da warDim Sales(1990 To 2015)
weder unterstützt VB.NET auch mit dem Kompatibilitäts-layer