Универсальные типы в Visual Basic (Visual Basic)
Универсальный тип является одиночным элементом программирования, который адаптируется для выполнения той же функциональности для различных типов данных.При определении универсального класса или процедуры нет необходимости определять отдельную версию для каждого типа данных, для которых может понадобиться выполнение той же функциональности.
Аналогией является отвертка со съемными головками.При работе с винтом необходимо выбрать и установить правильную головку для этого винта (с пазом, плоскую, звезду).После вставки правильной головки в отвертку, выполняется точно такая же функция с помощью отвертки, а именно вкручивание винта.
Отвертка используется в качестве универсального средства
При определении универсального типа в качестве параметров вы указываете один или несколько типов данных.Это позволяет с помощью кода настроить типы данных по их требованиям.В коде можно объявить несколько различных экземпляров универсального элемента, каждый из которых действует на отличном от других наборе типов данных.Но все объявленные элементы подчиняются одинаковой логике, независимо от того, какие типы данных они используют.
Например, вам может потребоваться создать и использовать класс очереди, который работает на определенном типе данных, такой как String.Можно объявить его как класс из System.Collections.Generic.Queue<T>, как показано в следующем примере.
Public stringQ As New System.Collections.Generic.Queue(Of String)
Теперь можно использовать stringQ для работы исключительно со значениями String.Поскольку stringQ является специфичным для String, а не для значений Object, то не нужно последующее связывание или преобразование типа.Это сохраняет время выполнения и сокращает количество ошибок выполнения.
Дополнительные сведения об использовании универсального типа содержатся в Практическое руководство. Использование универсального класса (Visual Basic).
Пример универсального класса
Следующий пример показывает скелетное определение универсального класса.
Public Class classHolder(Of t)
Public Sub processNewItem(ByVal newItem As t)
Dim tempItem As t
' Insert code that processes an item of data type t.
End Sub
End Class
В предыдущем скелете t является типом параметра, то есть указателем места заполнения для типа данных, введенного при объявлении класса.В других местах кода можно объявлять различные версии classHolder, указав различные типы данных для t.В следующем примере показано два таких объявления.
Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)
Предыдущие инструкции объявляют конструируемые классы, в которых фиксированный тип заменяет параметр типа.Эта замена распространяется по всему коду создаваемого класса.В следующем примере показано, что процедура processNewItem выглядит как в integerClass.
Public Sub processNewItem(ByVal newItem As Integer)
Dim tempItem As Integer
' Inserted code now processes an Integer item.
End Sub
Более полный пример содержится в разделе Практическое руководство. Определение класса, реализующего одинаковую функциональность для различных типов данных (Visual Basic).
Подходящие элементы программирования
Можно определять и использовать универсальные классы, структуры, интерфейсы, процедуры и делегаты.Обратите внимание, что .NET Framework определяет несколько универсальных классов, структур и интерфейсов, которые представляют собой часто используемые универсальные элементы.Пространство имен System.Collections.Generic предоставляет словари, списки, очереди и стеки.Перед определением собственного универсального элемента, проверьте, возможно он уже находится в System.Collections.Generic.
Процедуры не являются типами, но можно определять и использовать универсальные процедуры.См. раздел Универсальные процедуры в Visual Basic.
Преимущества универсальных типов
Универсальный тип служит в качестве основы для объявления нескольких различных программных элементов, каждый из которых работает с определенным типом данных.Альтернативами универсального типа являются:
Одиночный тип, работающий с типом данных Object.
Набор определенного типа версий типа, каждая версия закодирована индивидуально и работает с одним из конкретных типов данных, например, StringInteger, или определяемого пользователем типа, например, customer.
Универсальный тип имеет следующие преимущества относительно этих альтернатив:
Безопасность типа. Универсальные типы обеспечивают проверку типов во время компиляции.Типы, основанные на Object, могут принять значение любого типа данных, поэтому необходимо написать код для проверки, является ли тип входных данных приемлемым.При использовании универсальных типов компилятор может перехватить несоответствие типов до времени выполнения.
Производительность. Универсальные типы не имеют упакованных и распакованных типов данных, поскольку каждый из них является специальным для одного типа данных.Операции, основанные на Object должны упаковать входные данные для преобразования их в данные типа Object и распаковать данные, предназначенные для вывода.Упаковка и распаковка снижает производительность.
Типы основанные, на Object являются также типами с поздней привязкой, это означает, что доступ к их членам требует дополнительного кода во время выполнения.Это также снижает производительность.
Объединение кода. Код для универсального типа должен быть написан только один раз.Для набора версий определенного типа необходимо повторять один и тот же код в каждой версии, с единственным различием, который специфичен для этой версии.При использовании универсальных типов версии для определенного типа генерируется из исходного универсального типа.
Повторное использование кода. Код, который не зависит от определенного типа данных может быть использован с различными типами данных, если он универсальный.Можно повторно использовать его даже с тем типом данных, использование которого ранее не учитывалось.
Поддержка IDE. При использовании конструируемого типа, объявленного на основе универсального типа, в интегрированной среде разработки (IDE) вы можете получить большую поддержку при написании кода.Например, технология IntelliSense может указывать параметры тип-, определенного для аргумента конструктору или метода.
Универсальные алгоритмы. Абстрактные алгоритмы, которые не зависят от типов, являются хорошими кандидатами в универсальные типы.Например, универсальная процедура, которая сортирует пункты с помощью интерфейса IComparable, может использоваться с любым типом данных, который реализует IComparable.
Ограничения
Хотя код в определении универсального типа должен быть максимально независим от типов, может потребоваться учитывать возможности любого из типов данных, используемых для универсального типа.Например, если требуется сравнить два элемента с целью сортировки или упорядочивания, их тип данных должен реализовывать интерфейс IComparable.Можно соблюсти это требование путем добавления ограничения к параметру типа.
Пример ограничения.
Следующий пример показывает скелетное определение класса с ограничением, которое требует аргумент типа для реализации IComparable.
Public Class itemManager(Of t As IComparable)
' Insert code that defines class members.
End Class
Если последующий код попытается создать класс из itemManager, используя тип, который не реализован в IComparable,то компилятор сигнализирует об ошибке.
Типы ограничений.
Ограничение может содержать следующие требования в любой комбинации:
Аргумент типа должен реализовывать один или несколько интерфейсов.
Аргумент типа должен быть определенного типа, или наследовать не более, чем из одного класса
Аргумент типа должен предоставлять доступ к конструктору без параметров, код которого создает объекты из него.
Аргумент типа должен быть ссылочным типом, или он должен быть типом значения
Если требуется наложить более одного требования, используются запятые список ограничений внутри фигурных скобок ({ }).Для требования доступа к конструктору включите Оператор New (Visual Basic) ключевое слово в список.Чтобы потребовать ссылочный тип, включите ключевое слово Class; если требуется тип значения, то включите ключевое слово Structure.
Дополнительные сведения об ограничениях см. в разделе Список типов (Visual Basic).
Пример множественных ограничений.
Следующий пример показывает скелетное определение универсального класса со списком ограничений для типа параметра.В коде, который создает экземпляр этого класса, типизированный аргумент должен реализовать вместе IComparable и IDisposable интерфейсы, то есть он будет аргументом ссылочного типа и предоставлять доступ к конструктору без параметров.
Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
' Insert code that defines class members.
End Class
Важные термины
Универсальные типы вводят и используют в следующие термины:
универсальный тип (generic type).Определение класса, структуры, интерфейса, процедуры или делегата, для которых введен по крайней мере один тип данных при объявлении.
параметра типа (type parameter) .В определении универсального типа, это указатель места заполнения для типа данных, введенного при объявлении типа.
аргумент типа (type argument).Определенный тип данных, который заменяет тип параметра при объявлении конструируемого типа на основе универсального типа.
ограничение (constraint)Условие для типа параметра, которое ограничивает количество вариантов типов аргумента, которые можно указать для него.Ограничение может требовать, чтобы аргумент типа реализовывал определенный интерфейс, был или наследовал из определенного класса, имел доступ к конструктору без параметров или был ссылочным типом или типом значения.Можно объединять эти ограничения, но нужно указать не менее одного класса.
сконструированный тип (constructed type).Класс, структура, интерфейс, процедура или делегат, объявленные из универсального типа, при указании типов аргументов для его типов параметров.
См. также
Задачи
Устранение неполадок, связанных с типами данных (Visual Basic)
Ссылки
Сводка типов данных (Visual Basic)
Основные понятия
Типы значений и ссылочные типы
Другие ресурсы
Преобразование типов в Visual Basic