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


Универсальные процедуры в Visual Basic

Универсальная процедура, также называемая базовый метод — это процедура, определенная с помощью минимум одного параметра типа.Это позволяет вызывающему коду настраивать типы данных согласно их требованиям каждый раз, когда он вызывает процедуру.

Процедура не является универсальной просто на основании того, что она определена внутри базового класса или универсальной структуры.Чтобы быть универсальной, процедура должна принимать хотя бы один параметр типа в дополнение к обычным параметрам, которые она может принимать.Универсальный класс или структура может содержать неуниверсальные процедуры, а неуниверсальные класс, структура, или модуль могут содержать универсальные процедуры.

Универсальная процедура может использовать свои параметры типа в обычном списке параметров, в возвращаемом типе, если содержит таковой, и в коде процедуры.

Вывод типа

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

Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
    testSub("Use this string")
End Sub

Если компилятор не может вывести аргументы типа из контекста вызова, то он сообщает об ошибке.Одной из возможных причин такой ошибки является несоответствие ранга массива.Например, предположим, вы определили обычные параметры в виде массива параметра типа.При вызове универсальной процедуры с использованием массива другого ранга (число измерений), несоответствие вызывает сбой вывода типа.В следующем коде показан вызов, в котором двумерный массив передается в процедуру, ожидающую одномерный массив.

Public Sub demoSub(Of t)(ByVal arg() As t)

End Sub

Public Sub callDemoSub()

Dim twoDimensions(,) As Integer

demoSub(twoDimensions)

End Sub

Можно вызвать вывод типа только с посредством исключения всех аргументов типа.Если вы указываете один аргумент типа, необходимо указать их все.

Вывод типа поддерживается только для универсальных процедур.Невозможно вызвать вывод типа в универсальных классах, структурах, интерфейсах или делегатах.

Пример

ms235246.collapse_all(ru-ru,VS.110).gifОписание

В следующем примере определяется общая процедура Function для поиска конкретного элемента в массиве.Он определяет один параметр типа и использует его для создания двух параметров в списке параметров.

ms235246.collapse_all(ru-ru,VS.110).gifКод

Public Function findElement(Of T As IComparable) (
        ByVal searchArray As T(), ByVal searchValue As T) As Integer

    If searchArray.GetLength(0) > 0 Then
        For i As Integer = 0 To searchArray.GetUpperBound(0)
            If searchArray(i).CompareTo(searchValue) = 0 Then Return i
        Next i
    End If

    Return -1
End Function

ms235246.collapse_all(ru-ru,VS.110).gifКомментарии

В предыдущем примере требуется возможность сравнения searchValue с каждым элементом searchArray.Чтобы обеспечить эту возможность, параметр типа T ограничен для реализации интерфейса IComparable<T>.Код использует метод CompareTo вместо оператора =, поскольку нет гарантии того, что аргумент типа, предоставленный для T, поддерживает оператор =.

Можно проверить процедуру findElement с помощью следующего кода.

Public Sub tryFindElement()
    Dim stringArray() As String = {"abc", "def", "xyz"}
    Dim stringSearch As String = "abc"
    Dim integerArray() As Integer = {7, 8, 9}
    Dim integerSearch As Integer = 8
    Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
    Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
    MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
    MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
    MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub

Предыдущие вызовы MsgBox отображают "0", "1" и "-1"соответственно.

См. также

Задачи

Практическое руководство. Определение класса, реализующего одинаковую функциональность для различных типов данных (Visual Basic)

Практическое руководство. Использование универсального класса (Visual Basic)

Ссылки

Список типов (Visual Basic)

Список параметров (Visual Basic)

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

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

Процедуры в Visual Basic

Параметры и аргументы процедуры (Visual Basic)