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



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow