Visual Basic .NET Language
Array
Sök…
Anmärkningar
Dim myArray(2) As Integer
someFunc(myArray)
En matris är en indexbeställd samling av objekt. Typen av objekt definieras av den typ som anges i matrisdeklarationen.
Arrays i Visual Basic .NET är oftast (och som standard) noll (0) baserade, vilket innebär att det första indexet är 0. En matris med 10 element kommer att ha ett indexintervall på 0-9. Vid åtkomst till arrayelement är det maximala tillgängliga indexet ett mindre än det totala antalet element. På grund av detta bör slingor som åtkomst till arrayindex stegvis alltid göra en intervallkontroll där värdet är mindre än arrayens längd.
Array definition
Dim array(9) As Integer ' Defines an array variable with 10 Integer elements (0-9).
Dim array = New Integer(10) {} ' Defines an array variable with 11 Integer elements (0-10)
'using New.
Dim array As Integer() = {1, 2, 3, 4} ' Defines an Integer array variable and populate it
'using an array literal. Populates the array with
'4 elements.
ReDim Preserve array(10) ' Redefines the size of an existing array variable preserving any
'existing values in the array. The array will now have 11 Integer
'elements (0-10).
ReDim array(10) ' Redefines the size of an existing array variable discarding any
'existing values in the array. The array will now have 11 Integer
'elements (0-10).
Zero-Based
Alla matriser i VB.NET är nollbaserade. Med andra ord är indexet för det första objektet (nedre gränsen) i en VB.NET-matris alltid 0
. Äldre versioner av VB, som VB6 och VBA, var standardbaserade, men de gav ett sätt att åsidosätta standardgränserna. I de tidigare versionerna av VB kunde nedre och övre gränser uttryckligen anges (t.ex. Dim array(5 To 10)
. I VB.NET, för att upprätthålla kompatibilitet med andra .NET-språk, togs flexibiliteten bort och nedre gränsen av 0
verkställs nu alltid. To
syntaxen kan dock fortfarande användas i VB.NET, vilket kan göra intervallet mer tydligt tydligt. Exempelvis är följande exempel likvärdiga med de som anges ovan:
Dim array(0 To 9) As Integer
Dim array = New Integer(0 To 10) {}
ReDim Preserve array(0 To 10)
ReDim array(0 To 10)
Nested Array-deklarationer
Dim myArray = {{1, 2}, {3, 4}}
Förklara en enhet med en dimension och ange värden för matriselement
Dim array = New Integer() {1, 2, 3, 4}
eller
Dim array As Int32() = {1, 2, 3, 4}
Arrayinitialisering
Dim array() As Integer = {2, 0, 1, 6} ''Initialize an array of four Integers.
Dim strings() As String = {"this", "is", "an", "array"} ''Initialize an array of four Strings.
Dim floats() As Single = {56.2, 55.633, 1.2, 5.7743, 22.345}
''Initialize an array of five Singles, which are the same as floats in C#.
Dim miscellaneous() as Object = { New Object(), "Hello", New List(of String) }
''Initialize an array of three references to any reference type objects
''and point them to objects of three different types.
Multidimensionell arrayinitialisering
Dim array2D(,) As Integer = {{1, 2, 3}, {4, 5, 6}}
' array2D(0, 0) is 1 ; array2D(0, 1) is 2 ; array2D(1, 0) is 4
Dim array3D(,,) As Integer = {{{1, 2, 3}, {4, 5, 6}}, {{7, 8, 9}, {10, 11, 12}}}
' array3D(0, 0, 0) is 1 ; array3D(0, 0, 1) is 2
' array3D(0, 1, 0) is 4 ; array3D(1, 0, 0) is 7
Jagged Array Initialisering
Observera parentesen för att skilja mellan en taggad matris och en flerdimensionell matris. SubArrays kan ha olika längd
Dim jaggedArray()() As Integer = { ({1, 2, 3}), ({4, 5, 6}), ({7}) }
' jaggedArray(0) is {1, 2, 3} and so jaggedArray(0)(0) is 1
' jaggedArray(1) is {4, 5, 6} and so jaggedArray(1)(0) is 4
' jaggedArray(2) is {7} and so jaggedArray(2)(0) is 7
Noll arrayvariabler
Eftersom matriser är referenstyper kan en matrisvariabel vara noll. För att deklarera en variabel med nollmatris måste du deklarera den utan en storlek:
Dim array() As Integer
Eller
Dim array As Integer()
För att kontrollera om en matris är null, testa för att se om det Is Nothing
:
Dim array() As Integer
If array Is Nothing Then
array = {1, 2, 3}
End If
För att ställa in en befintlig matrisvariabel till null, ställer du den bara på Nothing
:
Dim array() As Integer = {1, 2, 3}
array = Nothing
Console.WriteLine(array(0)) ' Throws a NullReferenceException
Eller använd Erase
, som gör samma sak:
Dim array() As Integer = {1, 2, 3}
Erase array
Console.WriteLine(array(0)) ' Throws a NullReferenceException
Hänvisning till samma array från två variabler
Eftersom matriser är referenstyper är det möjligt att ha flera variabler som pekar på samma arrayobjekt.
Dim array1() As Integer = {1, 2, 3}
Dim array2() As Integer = array1
array1(0) = 4
Console.WriteLine(String.Join(", ", array2)) ' Writes "4, 2, 3"
Lägre gränser utan noll
Med Option Strict On
, även om .NET Framework möjliggör skapandet av enstaka dimensioner arrayer med icke-noll lägre gränser är de inte "vektorer" och så inte kompatibla med VB.NET-typade arrayer. Det betyder att de bara kan ses som Array
och att de inte kan använda normala array-referenser (index)
.
Dim a As Array = Array.CreateInstance(GetType(Integer), {4}, {-1})
For y = LBound(a) To UBound(a)
a.SetValue(y * y, y)
Next
For y = LBound(a) To UBound(a)
Console.WriteLine($"{y}: {a.GetValue(y)}")
Next
Förutom genom att använda Option Strict Off
kan du få tillbaka (index)
-syntaxen genom att behandla matrisen som en IList
, men då är det inte en matris, så du kan inte använda LBound
och UBound
på det variabla namnet (och du ' re undviker fortfarande inte boxning):
Dim nsz As IList = a
For y = LBound(a) To UBound(a)
nsz(y) = 2 - CInt(nsz(y))
Next
For y = LBound(a) To UBound(a)
Console.WriteLine($"{y}: {nsz(y)}")
Next
Flerdimensionella icke-nollbundna matriser är kompatibla med VB.NET multidimensionella typmatriser:
Dim nza(,) As Integer = DirectCast(Array.CreateInstance(GetType(Integer),
{4, 3}, {1, -1}), Integer(,))
For y = LBound(nza) To UBound(nza)
For w = LBound(nza, 2) To UBound(nza, 2)
nza(y, w) = -y * w + nza(UBound(nza) - y + LBound(nza),
UBound(nza, 2) - w + LBound(nza, 2))
Next
Next
For y = LBound(nza) To UBound(nza)
Dim ly = y
Console.WriteLine(String.Join(" ",
Enumerable.Repeat(ly & ":", 1).Concat(
Enumerable.Range(LBound(nza, 2), UBound(nza, 2) - LBound(nza, 2) + 1) _
.Select(Function(w) CStr(nza(ly, w))))))
Next
MSDN-referens: Array.CreateInstance