Поделиться через


Массивы в Visual Basic

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

С помощью массива можно ссылаться на эти значения, связанные с таким же именем, и вызывается используйтесь номер, называемый индексом, который необходимо указать его врозь.Отдельные значения, называются элементами массива.Они непрерывны от индекса 0 до наибольшее значение индекса.

В отличие от массива, переменную, содержащую одно значение называется скалярной переменной.

Содержание раздела

  • Элементы массива в простом массиве

  • Создание массива

  • Объявление массива

  • Сохранение значений в массиве

  • Заполнение массива начальными значениями

    • Вложенные литералы массива
  • Итерации массив

  • Массивы в качестве возвращаемых значений и параметры

  • Массивы массивов

  • Массивы нулевой длины

  • Размер массива

  • Типы массива и другие типы

  • Коллекции как альтернатива массивам

Элементы массива в простом массиве

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

Dim students(6) As Integer

Массив students в предыдущем примере содержит 7 элементов.Индексы элементов лежат в диапазоне от 0 до 6.Иметь этот массив проще, чем 7 объявление переменных.

На следующем рисунке показан массив students.Для каждого элемента массива:

  • Индекс элемента представляет школьный класс (индекс 0 представляет детский сад).

  • Значения, содержащиеся в элементе представляет число студентов в этом ранге.

Элементы массива "учеников"

Изображение массива, отображающее количество студентов

В следующем примере показано обращение к первому, второму и последнему элементу массива students.

Dim kindergarten As Integer = students(0)
Dim firstGrade As Integer = students(1)
Dim sixthGrade As Integer = students(6)
MsgBox("Students in kindergarten = " & CStr(kindergarten))
MsgBox("Students in first grade = " & CStr(firstGrade))
MsgBox("Students in sixth grade = " & CStr(sixthGrade))

Можно ссылаться на массив в целом, используя только имя переменной массива без индексов.

Массив students в предыдущем примере используется один индекс и считается, что будет является одномерным массивом.Массив, использующий более одного индекса, называется многомерным массивом.Дополнительные сведения см. в разделе Размерность массивов в Visual Basic и остальная часть этих секций.

Создание массива

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

Dim cargoWeights(10) As Double
Dim atmospherePressures(2, 2, 4, 10) As Short
Dim inquiriesByYearMonthDay(20)()() As Byte

Можно также использовать предложение New указать размер массива при его создании, как показано в следующем примере.

cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}

Если уже существует массив, можно переопределить его размер с помощью оператора Redim.Можно указать, что выписка Redim должна хранить значения, в массиве, или определить, что он создает пустой массив.В следующем примере показаны различные варианты использования оператора Redim для изменения размера существующего массива.

' Assign a new array size and retain the current element values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five element values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)

Дополнительные сведения см. в разделе Оператор ReDim (Visual Basic).

Объявление массива

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

После объявить массив, можно указать его размер с помощью Оператор ReDim (Visual Basic).

В следующем примере объявляется переменная одномерного массива, добавив пара скобок после типа.В примере также определяется измерения массива с помощью Оператор ReDim (Visual Basic).

' Declare a one-dimensional array.
Dim cargoWeights As Double()

' Dimension the array.
ReDim cargoWeights(15)

В следующем примере объявляется переменная многомерного массива, добавив пара скобок после типа и задав запятые внутри скобок для разделения измерения.В примере также определяется измерения массива с помощью Оператор ReDim (Visual Basic).

' Declare a multidimensional array.
Dim atmospherePressures As Short(,,,)

' Dimension the array.
ReDim atmospherePressures(1, 2, 3, 4)

Для объявления переменной массива массивов добавьте пару скобок после имени переменной для каждого уровня вложенных массива.

Dim inquiriesByYearMonthDay()()() As Byte

Приведенные выше примеры объявляют переменные, но не присвоены массива массивов к ним.По-прежнему необходимо создать массив, инициализировать его и присвоить его переменной.

Сохранение значений в массиве

К любому местоположению в массиве можно получить доступ, используя индекс типа Integer.Можно сохранять и извлекать значения массива, ссылаясь на местоположение в массиве с помощью индекса места, приведенного в скобках.Индексы для многомерных массивов разделяются запятыми (,).Требуется один индекс для каждого измерения массива.В следующем примере показаны некоторые операторы, которые сохраняют значения в массивах.

Dim i = 4
Dim j = 2

Dim numbers(10) As Integer
Dim matrix(5, 5) As Double

numbers(i + 1) = 0
matrix(3, j * 2) = j

В следующем примере показаны некоторые операторы, которые получают значения из массивов.

Dim v = 2
Dim i = 1
Dim j = 1
Dim k = 1
Dim wTotal As Double = 0.0
Dim sortedValues(5), rawValues(5), estimates(2, 2, 2) As Double
Dim lowestValue = sortedValues(0)
wTotal += (rawValues(v) ^ 2)
Dim firstGuess = estimates(i, j, k)

Заполнение массива начальными значениями

С помощью литералов массива можно создать массив, содержащий начальный набор значений.Литерал массива состоит из списка разделенных запятыми значений, заключенных в фигурные скобки ({}).

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

Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}

При использовании определение типа, тип массива определяется определяется как главный тип в список значений, предоставляемого для литерала массива.Является главным типом уникальный тип, к которому все другие типы литерала массива можно расширить.Если этот уникальный тип не может быть определена, является главным типом уникальный тип, к которому все другие типы массива можно ограничить.Если ни один из указанных уникальных типов нельзя определить, главным типом будет Object.Например, если список значений, указанное в литерал массива содержит значения типа Integer, Long и Double, то результирующий массив типа Double.Integer и Long расширяют только значение Double.Поэтому Double является главным типом.Дополнительные сведения см. в разделе Расширяющие и сужающие преобразования (Visual Basic).Эти правила зависимости применяются к типам, которые выводятся для массивов, локальные переменные, определенные в члена класса.Хотя с помощью литералов массива можно использовать при создании переменные на уровне класса, нельзя использовать определение типа на уровне класса.В результате литералы массива, определенные на уровне класса определяют значения, которые предоставляются для литерала массива как тип Object.

Можно явно задать тип элементов в массиве, который создается с помощью литерала массива.В таком случае значения литерала массива должны расширяться до типа элементов массива.В следующем примере кода создается массив типа Double из списка целых чисел.

Dim values As Double() = {1, 2, 3, 4, 5, 6}

wak0wfyt.collapse_all(ru-ru,VS.110).gifВложенные литералы массива

Можно создать многомерный массив с помощью вложенных литералов массива.Вложенные литералы массива должны иметь измерение и число измерений или ранжирования, которое согласуется с результирующий массив.В следующем примере кода создается двухмерный массив целых чисел с помощью литерала массива.

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

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

ПримечаниеПримечание

Избежать ошибки при указании вложенных литералов массива с различными измерениями можно, заключив внутренние литералы массива в круглые скобки.Скобки задают принудительное выражение литерала массива, а и результирующие значения используются с внешний литералом массива, как показано в следующем коде.

Dim values = {({1, 2}), ({3, 4, 5})}

При создании многомерного массива с помощью вложенных литералов массива можно использовать вывод типа.При использовании вывода типа выводимый тип является главным типом для всех значений всех литералов массива какого-либо уровня вложенности.В следующем примере кода создается двухмерный массив типа Double из значений типа Integer и Double.

Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Дополнительные примеры см. в разделе Практическое руководство. Инициализация переменной массива в Visual Basic.

Итерации массив

При репликации по массиву, доступ к которым каждый элемент массива возрастания индекса к самому высокому индекс.

Следующий пример выполняет перебор одномерный массив с помощью Оператор For... Next (Visual Basic).Метод GetUpperBound возвращает максимальное значение, которое может иметь индекс.Наименьшее значение индекса всегда равно 0.

Dim numbers = {10, 20, 30}

For index = 0 To numbers.GetUpperBound(0)
    Debug.WriteLine(numbers(index))
Next
' Output:
'  10
'  20
'  30

Следующий пример выполняет перебор многомерный массив с помощью выписки For...Next.Метод GetUpperBound имеет параметр, который определяет измерение.GetUpperBound(0) возвращает высокое значение индекса первого измерения, и GetUpperBound(1) возвращает высокое значение индекса второго измерения.

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For index0 = 0 To numbers.GetUpperBound(0)
    For index1 = 0 To numbers.GetUpperBound(1)
        Debug.Write(numbers(index0, index1).ToString & " ")
    Next
    Debug.WriteLine("")
Next
' Output 
'  1 2 
'  3 4 
'  5 6

Следующий пример выполняет перебор одномерный массив с помощью Оператор For Each... Next (Visual Basic).

Dim numbers = {10, 20, 30}

For Each number In numbers
    Debug.WriteLine(number)
Next
' Output:
'  10
'  20
'  30

Следующий пример выполняет перебор многомерный массив с помощью выписки For Each...Next.Однако имеется несколько элементов управления над элементами многомерного массива при использовании вложенных оператора For…Next, как показано в предыдущем примере, вместо выписки For Each…Next.

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For Each number In numbers
    Debug.WriteLine(number)
Next
' Output:
'  1
'  2
'  3
'  4
'  5
'  6

Массивы в качестве возвращаемых значений и параметры

Для возвращения массива из процедуры Function укажите тип данных массива и число измерений в качестве возвращаемого типа Оператор Function (Visual Basic).Внутри функции, объявите локальной переменной массива с тем же типом данных и количеством измерений.В Оператор Return (Visual Basic), включите локальной переменной массива без скобок.

Чтобы определить массив в качестве параметра в процедуру Sub или Function, задайте параметр как массив с указанными типом данных и количеством измерений.В вызове процедуры, отправьте переменной массива с тем же типом данных и количеством измерений.

В следующем примере функция GetNumbers возвращает значение Integer().Этот тип массива одномерный массив типа Integer.Процедура ShowNumbers принимает аргумент Integer().

Public Sub Process()
    Dim numbers As Integer() = GetNumbers()
    ShowNumbers(numbers)
End Sub

Private Function GetNumbers() As Integer()
    Dim numbers As Integer() = {10, 20, 30}
    Return numbers
End Function

Private Sub ShowNumbers(numbers As Integer())
    For index = 0 To numbers.GetUpperBound(0)
        Debug.WriteLine(numbers(index) & " ")
    Next
End Sub

' Output:
'   10
'   20
'   30

В следующем примере функция GetNumbersMultiDim возвращает значение Integer(,).Этот тип массива двумерный массив типа Integer.Процедура ShowNumbersMultiDim принимает аргумент Integer(,).

Public Sub ProcessMultidim()
    Dim numbers As Integer(,) = GetNumbersMultidim()
    ShowNumbersMultidim(numbers)
End Sub

Private Function GetNumbersMultidim() As Integer(,)
    Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}}
    Return numbers
End Function

Private Sub ShowNumbersMultidim(numbers As Integer(,))
    For index0 = 0 To numbers.GetUpperBound(0)
        For index1 = 0 To numbers.GetUpperBound(1)
            Debug.Write(numbers(index0, index1).ToString & " ")
        Next
        Debug.WriteLine("")
    Next
End Sub

' Output  
'  1 2  
'  3 4  
'  5 6

Массивы массивов

Массив, который содержит другие массивы как элементы как массив массивов или массива массивов.Массив массивов, и каждый элемент массива массивов могут иметь одно или несколько измерений.Иногда структура данных в приложении является двухмерной, но не прямоугольной.

Следующий пример содержит массив месяцев, каждый элемент которого имеет массив дней.Поскольку разные месяцы имеют различные числа дней, элементы не принимают форму прямоугольный двумерный массив.Поэтому вместо многомерного массива используется массив массивов.

' Declare the jagged array.
' The New clause sets the array variable to a 12-element
' array. Each element is an array of Double elements.
Dim sales()() As Double = New Double(11)() {}

' Set each element of the sales array to a Double
' array of the appropriate size.
For month As Integer = 0 To 11
    Dim days As Integer =
        DateTime.DaysInMonth(Year(Now), month + 1)
    sales(month) = New Double(days - 1) {}
Next month

' Store values in each element.
For month As Integer = 0 To 11
    Dim upper = sales(month).GetUpperBound(0)
    For day = 0 To upper
        sales(month)(day) = (month * 100) + day
    Next
Next

Массивы нулевой длины

Массив, который не содержит элементов также вызывается массив нулевой длины.Переменная, которая содержит массив нулевой длины не имеет значение Nothing.Создать массив без элементов, объявите одно из измерений массива и равен -1, как показано в следующем примере.

Dim twoDimensionalStrings(-1, 3) As String

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

  • Без рисковать исключение NullReferenceException, код должен получить доступ к членам класса Array, например Length или Rank, либо вызовите функцию Visual Basic, таких как UBound.

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

  • Код взаимодействует с программным интерфейсом (API), или необходимо передать массив нулевой длины с одним или несколькими процедуры или возвращает массив нулевой длины из одной или нескольких процедур.

Размер массива

Размер массива является произведением длин всех его измерений.Он представляет собой общее число элементов, в данный момент содержащихся в массиве.

В следующем примере показано объявление трехмерного массива:

Dim prices(3, 4, 5) As Long

Общий размер массива в переменной prices составляет (3 + 1) x (4 + 1) x (5 + 1) = 120.

Размер массива можно определить с помощью свойства Length.Длину каждого измерения многомерного массива можно получить с помощью метода GetLength.

Можно изменять размер переменной массива, присваивая ей новый объект массива, или с помощью оператора ReDim.

Существует ряд особенностей, о которых следует помнить при работе с размером массива.

Длина измерения

Индекс каждого измерения начинается с 0, что означает, что его диапазон от 0 до верхней границы.Таким образом, длина данного измерения на 1 больше объявленной верхней границы этого измерения.

Ограничения длины

Длина каждого измерения массива ограничена максимальным значением типа Integer, которое равно (2 ^ 31) - 1.Тем не менее, общий размер массива также ограничен доступной памятью в системе.При попытке инициализировать массив, размер которого превышает объем доступной оперативной памяти, общеязыковая среда выполнения создает исключение OutOfMemoryException.

Размер и размер элемента

Размер массива не зависит от типа его элементов.Размер всегда представляет общее число элементов, а не число байтов, занимаемое массивом при хранении.

Затраты памяти

Небезопасно делать любые предположения относительно способа хранения массива в памяти.Хранение зависит от размерности данных платформы, так один и тот же массив может потреблять больше памяти на 64-разрядных системах, чем на 32-разрядных.В зависимости от конфигурации системы при инициализации массива общеязыковая среда выполнения (CLR) может указывать такие способы хранения, как упаковка элементов максимально близко друг к другу или выравнивание всех элементов по естественным аппаратным границам памяти.Кроме того массив нуждается в хранении служебной информации, и размер этой информации возрастает при каждом добавлении измерения.

Типы массива и другие типы

Каждый массив имеет тип данных, но этот тип отличается от типа данных его элементов.Не существует единого типа данных, подходящего для всех массивов.Вместо этого тип данных массива определяется числом измерений массива, или рангом, и типом данных элементов массива.Две переменные массивов имеют один тип, только если массивы одного ранга и содержат данные одного и того же типа.Длины измерений массива не влияют на тип данных массива.

Каждый массив наследуется от класса System.Array, и можно объявить переменную типа Array, но не нельзя создать массив типа Array.Кроме того, Оператор ReDim (Visual Basic) не может работать с переменной, объявленной как тип Array.По этой причине и для строгой типизации рекомендуется объявить каждый массив как конкретный тип, например Integer, как в предыдущем примере.

Можно выяснить тип данных массива или его элементов несколькими способами.

  • Можно вызвать метод Object.GetType для переменной для получения объекта Type типа переменной времени выполнения.Объект Type содержит подробные сведения в своих свойствах и методах.

  • Можно передать переменную функции TypeName, чтобы получить объект String, содержащий имя типа времени выполнения.

  • Можно передать переменную функции VarType для получения значения VariantType, представляющего классификацию типа переменной.

В следующем примере вызывается функция TypeName для определения типа массива и типа элементов в массиве.Массив имеет тип Integer(,), а элементы массива относятся к типу Integer.

Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {}
MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray))
MsgBox("Type of thisTwoDimArray(0, 0) is " & TypeName(thisTwoDimArray(0, 0)))

Коллекции как альтернатива массивам

Массивы наиболее эффективны для создания и работы с фиксированным числом строго типизированных объектов.Коллекции обеспечивают более гибкий способ для работы с группами объектов.В отличие от массивы, группе в составе объекты, работе с чонсервной банкой увеличивается и уменьшается динамически как изменения приложения.

Если требуется изменить размер массива, необходимо использовать Оператор ReDim (Visual Basic).После этого Visual Basic создает новый массив и освобождает предыдущий массив.Это занимает время выполнения.Таким образом, если число элементов при работе изменяется часто или нельзя предсказать максимальное число необходимых элементов, можно получить большую производительность при использовании коллекции.

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

Если коллекция содержит элементы только одного типа данных, можно использовать один из классов в пространстве имен System.Collections.Generic.Универсальная коллекция обеспечивает безопасность типов, так что другие типы данных не могут быть в нее добавлены.При извлечении элемента из универсальной коллекции нет необходимости определять или преобразовывать его тип данных.

Дополнительные сведения о коллекциях см. в разделе Коллекции (C# и Visual Basic).

wak0wfyt.collapse_all(ru-ru,VS.110).gifПример

В следующем примере используется универсальный класс .NET Framework System.Collections.Generic.List<T> для создания коллекции-списка объектов Customer.

' Define the class for a customer.
Public Class Customer
    Public Property Name As String
    ' Insert code for other members of customer structure.
End Class

' Create a module-level collection that can hold 200 elements.
Public CustomerList As New List(Of Customer)(200)

' Add a specified customer to the collection.
Private Sub AddNewCustomer(ByVal newCust As Customer)
    ' Insert code to perform validity check on newCust.
    CustomerList.Add(newCust)
End Sub

' Display the list of customers in the Debug window.
Private Sub PrintCustomers()
    For Each cust As Customer In CustomerList
        Debug.WriteLine(cust)
    Next cust
End Sub

Объявление коллекции CustomerFile задает, что она может содержать только элементы типа Customer.Она также имеет исходную емкость 200 элементов.Процедура AddNewCustomer проверяет новый элемент на допустимость и затем добавляет его к коллекции.Процедура PrintCustomers использует цикл For Each для прохода по коллекции и отображения ее элементов.

Связанные разделы

Термин

Определение

Размерность массивов в Visual Basic

Объяснение ранга и измерений в массиве.

Практическое руководство. Инициализация переменной массива в Visual Basic

Описывает заполнение массивов начальными значениями.

Практическое руководство. Сортировка массива в Visual Basic

Объяснение, как сортировать элементы массива в алфавитном порядке.

Практическое руководство. Присвоение одного массива другому (Visual Basic)

Описание правил и действий для назначения массива другой переменной массива.

Устранение неполадок, связанных с массивами (Visual Basic)

Рассмотрение некоторых общих проблем, возникающих при работе с массивами.

См. также

Ссылки

Оператор Dim (Visual Basic)

Оператор ReDim (Visual Basic)

Array