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


Практическое руководство. Определение строго типизированной коллекции

Обновлен: Ноябрь 2007

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

Public Class widgetRepository
    Public widgetColl As New Microsoft.VisualBasic.Collection()
    ' Insert code to implement additional functionality.
End Class

Однако эта коллекция widgetColl не является строго типизированной. Можно добавить в нее любые другие типы элементов помимо widget. При извлечении элемента, возможно, потребуется преобразовать его в widget. Это может привести к проблемам безопасности типа. Например, предположим, выполняется добавление String в коллекцию с помощью следующего кода.

Dim notWidget As String = "This is not a widget object!"
widgetColl.Add(notWidget)

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

Защита от проблем безопасности типа

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

Чтобы определить строго типизированную коллекцию в классе

  • Используйте один из универсальных классов в пространстве имен System.Collections.Generic, такой как List<T>, для класса коллекции. Затем можно создать коллекцию, в которую входят только члены widget. В следующем примере показано, как объявление в предыдущем примере может быть изменено для создания универсальной коллекции.

    Public widgetColl As New System.Collections.Generic.List(Of widget)
    

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

    или

  • Создайте собственный класс коллекции без использования всех предварительно определенных классов. Можно ввести ограничения на метод Add, чтобы он принимал только объекты widget и реализовывал свойство Item, возвращая тип widget. Дополнительные сведения см. в разделе Практическое руководство. Определение строго типизированной коллекции.

    Если возвращенные элементы Item типа Object, необходимо иметь явный доступ только к свойствам и методам, определенным в классе Object. Для доступа к членам widget необходимо либо включить Option Strict Off, либо использовать Функция CType для явного преобразования возвращаемого элемента в widget, как показано в следующем коде.

    Dim nextWidget As widget
    Try
        nextWidget = CType(widgetColl.Item(1), widget)
    Catch ex As Exception
        ' Insert code to run if the collection item is not a widget.
    End Try
    

    Так или иначе, использование элементов Object таким образом вынуждает Visual Basic использовать позднее связывание, которое снижает производительность.

    Обратите внимание, что класс CollectionVisual Basic принимает и возвращает элементы Object, поэтому он также имеет недостаток слабого типизирования и позднего связывания.

См. также

Основные понятия

Классы коллекций в Visual Basic

Коллекции в Visual Basic

Универсальные типы в Visual Basic

Ссылки

System.Collections

System.Collections.Generic

System.Collections.Specialized

Оператор Option Strict