다음을 통해 공유


Visual Basic의 제네릭 프로시저

제네릭 메서드라고도 하는 제네릭 프로시저는 하나 이상의 형식 매개 변수로 정의된 프로시저입니다. 이를 통해 호출 코드는 프로시저를 호출할 때마다 해당 요구 사항에 맞게 데이터 형식을 조정할 수 있습니다.

프로시저는 제네릭 클래스 또는 제네릭 구조 내에서 정의되기 때문에 제네릭이 아닙니다. 제네릭이 되려면 프로시저가 사용할 수 있는 일반 매개 변수 외에 하나 이상의 형식 매개 변수를 사용해야 합니다. 제네릭 클래스 또는 구조체는 비제네릭 프로시저를 포함할 수 있으며, 비제너릭 클래스, 구조 또는 모듈에는 제네릭 프로시저가 포함될 수 있습니다.

제네릭 프로시저는 일반 매개 변수 목록, 반환 형식(있는 경우) 및 프로시저 코드에서 해당 형식 매개 변수를 사용할 수 있습니다.

타입 추론

형식 인수를 전혀 제공하지 않고 제네릭 프로시저를 호출할 수 있습니다. 이러한 방식으로 호출하는 경우 컴파일러는 프로시저의 형식 인수에 전달할 적절한 데이터 형식을 확인하려고 시도합니다. 이를 형식 유추라고합니다. 다음 코드는 컴파일러가 형식 매개 변수String에 형식 t 을 전달해야 한다고 유추하는 호출을 보여 줍니다.

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

컴파일러가 호출 컨텍스트에서 형식 인수를 유추할 수 없는 경우 오류를 보고합니다. 이러한 오류의 한 가지 가능한 원인은 배열 순위 불일치입니다. 예를 들어 일반 매개 변수를 형식 매개 변수의 배열로 정의한다고 가정합니다. 다른 순위(차원 수)의 배열을 제공하는 제네릭 프로시저를 호출하면 불일치로 인해 형식 유추가 실패합니다. 다음 코드는 2차원 배열이 1차원 배열을 예상하는 프로시저에 전달되는 호출을 보여 줍니다.

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

Public Sub callDemoSub()
    Dim twoDimensions(,) As Integer
    demoSub(twoDimensions)
End Sub

모든 형식 인수를 생략해야만 형식 유추를 호출할 수 있습니다. 하나의 형식 인수를 제공하는 경우 모두 제공해야 합니다.

형식 유추는 제네릭 프로시저에 대해서만 지원됩니다. 제네릭 클래스, 구조체, 인터페이스 또는 대리자에서는 형식 유추를 호출할 수 없습니다.

예시

설명

다음 예제에서는 배열에서 특정 요소를 찾는 제네릭 Function 프로시저를 정의합니다. 하나의 형식 매개 변수를 정의하고 이를 사용하여 매개 변수 목록에서 두 매개 변수를 생성합니다.

코드

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

코멘트

앞의 예제에서는 searchValuesearchArray의 각 요소와 비교할 수 있는 기능이 필요합니다. 이 기능을 보장하기 위해 형식 매개 변수 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"을 표시합니다.

참고하십시오