Коллекции в Visual Basic нужны для хранения группы объектов или значений в переменной. Стандартные коллекции, такие как Collection, ArrayList и обобщённые List(Of T), предоставляют различные методы доступа, добавления и удаления элементов, и различаются по типовой безопасности, производительности и возможностям.
В классическом VB6 была только типизированная коллекция Collection. В .NET появились более мощные структуры, среди которых ArrayList (старый универсальный тип без строгой типизации) и современные обобщённые коллекции (Generic Collections) вроде List(Of T), появившиеся в .NET 2.0.
Главная сложность — выбор подходящей коллекции под задачи проекта. Коллекции без строгой типизации (ArrayList, Collection) могут привести к ошибкам времени выполнения или проблемам с производительностью. Обобщённые коллекции требуют параметризации, но дают максимальную безопасность и удобство работы с типами.
Используйте старую коллекцию Collection только для взаимодействия с устаревшим кодом, а для новых проектов отдавайте предпочтение List(Of T). Коллекция ArrayList пригодится только когда нет сведений о типе элементов, но для этого лучше использовать List(Of Object) или другие коллекции из Generic.
Пример кода:
' Collection Dim coll As New Collection() coll.Add("Hello") coll.Add(123) ' ArrayList Dim arr As New ArrayList() arr.Add("World") arr.Add(456) ' List(Of T) Dim list As New List(Of Integer)() list.Add(789) list.Add(101112)
Ключевые особенности:
Чем отличается Collection от массива в Visual Basic?
Массив фиксирует размер при инициализации, хранит элементы одного типа и поддерживает быстрый доступ по индексу. Collection динамически увеличивается, может хранить объекты разных типов и поддерживает доступ по ключу (но неиндексируемый в VB6).
Что произойдет, если попытаться добавить объект с одинаковым ключом в Collection?
Попытка добавить элемент с уже существующим ключом приведёт к ошибке времени выполнения "Key already exists in collection".
Dim c As New Collection() c.Add("one", "a") c.Add("two", "a") ' Ошибка
Можно ли привести ArrayList к типу List(Of T) стандартным способом?
Нет, обычное преобразование невозможно — придется вручную создавать новый List(Of T) и копировать подходящие элементы, иначе возникнут ошибки времени выполнения из-за нестрогой типизации ArrayList.
В проекте для хранения клиентов используется ArrayList, куда случайно добавили строку вместо объекта Client. На этапе обработки возникает ошибка приведения типа, которую сложно отследить.
Плюсы:
Минусы:
Используется строго типизированный List(Of Client), весь код компилируется с опцией Strict On. Ошибки обнаруживаются на этапе компиляции, структура легко расширяется новыми методами LINQ.
Плюсы:
Минусы: