Классы коллекций в Visual Basic
Обновлен: Ноябрь 2007
Коллекция представляет собой способ группирования набора связанных элементов. Существует множество различных типов коллекций. Предопределенные коллекции используются в приложениях Visual Basic для многих целей, например Control.ControlCollection в задаче Form, возвращенной свойством формы Controls. Можно также создать собственные коллекции для упорядочения объектов и управления ими.
Коллекции — это хороший способ отслеживания объектов, которые приложение может динамически создавать и уничтожать. В приведенном ниже фрагменте кода показано, как можно использовать в Visual Basicметод Add из объекта Collection, чтобы сохранить список объектов widget, созданных пользователем.
' Declare and create the Collection object.
Public widgetColl As New Microsoft.VisualBasic.Collection()
' Create a new widget and add it to the widgetColl collection.
Private Sub makeAWidget()
Dim tempWidget As New widget()
widgetColl.Add(tempWidget)
End Sub
В предыдущем примере в коллекции widgetColl собраны и упорядочены все объекты widget, созданные с помощью процедуры makeAWidget. Используя индекс коллекции, можно извлечь ссылки на объект для каждого объекта widget. Размер коллекции регулируется автоматически при каждом добавлении объекта widget. Инструкция For Each... Next (Visual Basic) можно использовать для просмотра всех элементов коллекции. Если требуется предоставить объекту widget ключ, по которому его можно извлечь, укажите текстовую строку в качестве второго параметра метода Add.
В объекте Visual Basic Collection все элементы хранятся с типом Object, поэтому можно добавить элемент любого типа данных. Нет никакой защиты от добавления неподходящих типов данных. Чтобы обойти это обстоятельство, можно использовать универсальные коллекции пространства имен System.Collections.Generic. Дополнительные сведения см. в разделе Практическое руководство. Создание коллекции объектов.
Создание и уничтожение объекта коллекции
Ключевое слово New (Visual Basic) в объявлении переменной widgetColl вызывает создание объекта Collection, когда управление передается оператору объявления. Поскольку Collection — это класс, а не тип значения, необходимо создать его экземпляр и хранить ссылку на этот экземпляр в переменной. Этот экземпляр является объектом Collection в Visual Basic.
Как любой другой объект, объект Collection помечается для сборки мусора (garbage collection, GC), когда последняя переменная, которая содержит ссылку на него, получает значение Nothing (Visual Basic) или выходит за область действия. Все содержащиеся в нем ссылки на объекты освобождаются после его утилизации функцией сборки мусора. Поэтому переменная widgetColl в предыдущем примере объявлена в родительском классе, чтобы она могла существовать на протяжении срока службы программы.
В коллекции хранятся ссылки на управляемые объекты, но не содержатся сами объекты. Таким образом, при уничтожении объекта Collection не удаляются объекты, которыми он управляет. Каждый отдельный объект, который был элементом коллекции, продолжает существовать до тех пор, пока он не будет персонально помечен для сборки мусора.
Работа с элементами
Простейшие средства добавления в коллекцию, удаления и извлечения из нее зависят от ключей и индексов. Ключ — это значение типа String. Это может быть имя, номер водительского удостоверения, номер телефона или просто целое число, преобразованное в строку. Метод Add позволяет связать ключ с элементом (описание см. в разделе Практическое руководство. Добавление, удаление и извлечение элементов из коллекции).
Индекс в классе Collection представляет собой целое число между 1 и числом элементов в коллекции. Свойство Count (объект Collection) возвращает текущее число элементов. Можно контролировать начальное значение индекса элемента с помощью параметров Before и After при вызове функции Add, но значение индекса может изменяться по мере добавления и удаления других элементов. Дополнительные сведения см. в разделе Метод Add (объект Collection).
Можно удалить один элемент из коллекции, передавая его ключ или индекс вМетод Remove (объект Collection). Можно очистить коллекцию и удалить все элементы с помощью Метод Clear (объект Collection).
Доступ к элементам
Можно передать значение ключа в Метод Contains (объект Collection), чтобы проверить, содержит ли коллекция элемент с этим ключом. Чтобы извлечь элемент, можно передать его ключ или индекс в Свойство Item (объект Collection).
Можно использовать значения индекса и свойство Item для просмотра всех элементов в коллекции или можно использовать Инструкция For Each... Next (Visual Basic). В приведенном ниже примере показано два способа для предоставления всем сотрудникам в коллекции объектов employee повышения на 10 процентов, исходя из предположения, что переменная employeesColl содержит ссылку на объект Collection.
Option Strict On
' The following alternative uses the Count and Item properties.
Dim emp As employee
For counter As Integer = 1 To employeesColl.Count
emp = CType(employeesColl.Item(counter), employee)
emp.payRate *= 1.1
Next counter
' The following alternative uses the For Each...Next statements.
For Each emp As employee In employeesColl
emp.payRate *= 1.1
Next emp
Однако при добавлении в employeesColl одного или нескольких элементов, которые относятся к типу employee, цикл For Each вызовет исключение ArgumentException во время выполнения.
Тип данных элементов
В объекте Collection в Visual Basic каждый элемент сохраняется с типом данных Object. Таким образом, диапазон типов данных, которые можно добавить в объект Collection, совпадает с диапазоном типов данных, которые можно хранить в переменной Object. В этот список входят стандартные типы данных, объекты и массивы, а также заданные пользователем структуры и экземпляры классов.
Поскольку в объекте Collection каждый элемент хранится как Object, свойство Item возвращает значение Object. Чтобы использовать элемент в коде, необходимо преобразовать его из типа Object в тип данных времени выполнения. Способ выполнения этой задачи зависит от параметра ключа проверки типа в Оператор Option Strict.
Неявное преобразование из объекта
Если Option Strict имеет значение Off, можно неявно преобразовать элемент из объекта Collection в подходящий тип данных, как показано в приведенном ниже примере.
Option Strict Off
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
aString = sampleColl.Item(1)
Catch ex As Exception
' Insert code to run if the collection item cannot be converted to String.
End Try
Явное преобразование из объекта
Если Option Strict имеет значение On, необходимо явным образом преобразовать элемент из типа Object в тип данных времени выполнения. Чтобы получить элемент из Item таким образом, можно использовать Функция CType для выполнения преобразования, как показано в приведенном ниже примере.
Option Strict On
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
aString = CType(sampleColl.Item(1), String)
Catch ex As Exception
' Insert code to run if the collection item cannot be converted to String.
End Try
Дополнительные службы
Свойства и методы объекта Collection являются лишь простейшими средствами обслуживания коллекций. Например, метод Add не может проверить тип элемента, добавляемого в коллекцию, что могло бы послужить гарантией того, что коллекция содержит элементы только одного типа. Если можно обеспечить это в методе Add, то вы имеете коллекцию со строгим типом и вам не нужно выполнять преобразование возвращаемого значения из свойства Item в соответствующий тип данных времени выполнения. Это повышает производительность.
Можно предоставить более надежные возможности — дополнительные свойства, методы и события — путем создания собственного класса коллекций, как описано в Практическое руководство. Определение коллекций в классах.
См. также
Основные понятия
Коллекции как альтернатива массивам