Поиск…


замечания

Dim myArray(2) As Integer

someFunc(myArray)

Массив представляет собой упорядоченный по индексу набор объектов. Тип объекта определяется типом, указанным в объявлении массива.

Массивы в Visual Basic .NET чаще всего (и по умолчанию) основаны на нуле (0), что означает, что первый индекс равен 0. Массив из 10 элементов будет иметь диапазон индексов от 0 до 9. При доступе к элементам массива максимальный доступный индекс меньше, чем общее количество элементов. Из-за этого циклы, которые инкрементно обращаются к индексам массивов, всегда должны проверять диапазон, где значение меньше длины массива.

Определение массива

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

Все массивы в VB.NET основаны на нуле. Другими словами, индекс первого элемента (нижняя граница) в массиве VB.NET всегда равен 0 . Старые версии VB, такие как VB6 и VBA, по умолчанию были по умолчанию, но они предоставили возможность переопределить границы по умолчанию. В тех более ранних версиях VB нижняя и верхняя границы могут быть явно указаны (например, Dim array(5 To 10) . В VB.NET, чтобы поддерживать совместимость с другими языками .NET, эта гибкость была удалена, а нижняя граница из 0 Теперь синтаксис To все еще может использоваться в VB.NET, который может сделать ясность явным образом ясным. Например, следующие примеры эквивалентны перечисленным выше:

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)

Вложенные массивы

Dim myArray = {{1, 2}, {3, 4}}

Объявить одномерный массив и задать значения элемента массива

Dim array = New Integer() {1, 2, 3, 4}

или же

Dim array As Int32() = {1, 2, 3, 4}

Инициализация массива

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.

Инициализация многомерных массивов

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

Инициализация зубчатых массивов

Обратите внимание на скобки, чтобы различать неровный массив и многомерный массив. SubArrays могут иметь разную длину

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

Переменные Null Array

Поскольку массивы являются ссылочными типами, переменная массива может быть нулевой. Чтобы объявить нулевую переменную массива, вы должны объявить ее без размера:

Dim array() As Integer

Или же

Dim array As Integer()

Для того, чтобы проверить , если массив имеет нулевое значение, тест , чтобы увидеть , если это Is Nothing :

Dim array() As Integer
If array Is Nothing Then
    array = {1, 2, 3}
End If

Чтобы установить существующую переменную массива в значение null, просто установите для нее значение Nothing :

Dim array() As Integer = {1, 2, 3}
array = Nothing
Console.WriteLine(array(0))  ' Throws a NullReferenceException

Или используйте Erase , что делает то же самое:

Dim array() As Integer = {1, 2, 3}
Erase array
Console.WriteLine(array(0))  ' Throws a NullReferenceException

Ссылка на один массив из двух переменных

Поскольку массивы являются ссылочными типами, возможно иметь несколько переменных, указывающих на один и тот же объект массива.

Dim array1() As Integer = {1, 2, 3}
Dim array2() As Integer = array1
array1(0) = 4
Console.WriteLine(String.Join(", ", array2))  ' Writes "4, 2, 3"

Ненулевые нижние оценки

С Option Strict On , хотя .NET Framework позволяет создавать массивы с одним измерением с ненулевыми нижними границами, они не являются «векторами» и поэтому не совместимы с типизированными массивами VB.NET. Это означает, что они могут рассматриваться только как Array и поэтому не могут использовать ссылки на нормальный массив (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

Как и при использовании Option Strict Off , вы можете получить синтаксис (index) , обработав массив как IList , но тогда это не массив, поэтому вы не можете использовать LBound и UBound для этого имени переменной (и вы, все еще не избегая бокса):

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

Многомерные ненулевые ниже ограниченные массивы совместимы с VB.NET многомерными массивами набранными:

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: Array.CreateInstance



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow