ПрограммированиеVB.NET разработчик

Как работает обращение к элементам коллекции типа List(Of T) в Visual Basic, какие операции доступны и в каких случаях возникают ошибки при доступе по индексу?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

История вопроса

Коллекция List(Of T) введена в VB.NET для замены устаревших коллекций, обеспечивая типобезопасность, динамическое изменение размера и быстрый доступ к элементам по индексу. Использование списка позволяет структурировать данные, работать с типизированными элементами и избегать распространённых ошибок, связанных с неуниверсальными коллекциями.

Проблема

Новички часто не понимают, как правильно обращаться к элементам списка, как добавлять, изменять и удалять элементы, и что произойдет при неверном использовании индексов (например, выход за пределы списка). Это приводит к исключениям во время работы программы.

Решение

В List(Of T) элементы индексируются с нуля. Доступ к элементу осуществляется по индексу как для чтения, так и для записи. Если индекс недопустим, возникает исключение ArgumentOutOfRangeException. Методы коллекции позволяют безопасно работать с элементами:

Пример кода:

Imports System.Collections.Generic Dim numbers As New List(Of Integer)() numbers.Add(10) numbers.Add(20) Dim first As Integer = numbers(0) ' Получить элемент с индексом 0 numbers(1) = 99 ' Установить элемент с индексом 1 ' Удаление numbers.RemoveAt(0) ' Удалить по индексу

Ключевые особенности:

  • Динамический размер, автоматическое перераспределение памяти
  • Быстрый индексированный доступ O(1)
  • Типобезопасность (ошибки типов исключены во время компиляции)

Вопросы с подвохом.

Если обратиться к индексу, который равен количеству элементов в List(Of T), получим ли мы последний элемент?

Нет. Индексация идет с 0, а максимальный допустимый индекс — (Count - 1). При обращении по индексу равному Count возникнет ошибка ArgumentOutOfRangeException.

Можно ли добавить элемент в середину List(Of T) без удаления существующих данных?

Да, с помощью метода Insert:

numbers.Insert(1, 42) ' Вставит 42 на вторую позицию, сдвигая остальные вправо.

Опасно ли изменять коллекцию List(Of T) во время перебора с помощью For Each?

Опасно. Это приведет к InvalidOperationException. Для таких операций используйте For с индексом или сначала сформируйте список для удаления.

Типовые ошибки и анти-паттерны

  • Обращение к несуществующему индексу
  • Удаление/добавление элементов в For Each
  • Нехватка проверки на пустоту перед доступом

Пример из жизни

Негативный кейс

В программе перебирают List(Of T) с помощью For Each и внутри итерации удаляют элементы.

Плюсы:

  • Простота написания

Минусы:

  • Программа аварийно завершится с InvalidOperationException, данные не обработаны

Позитивный кейс

Код перебирает элементы с конца к началу через For и удаляет подходящие объекты.

Плюсы:

  • Нет исключений, все удаляется корректно

Минусы:

  • Чуть сложнее читаемость цикла