대리자는 메서드를 참조하는 개체입니다. 다른 프로그래밍 언어에서 사용되는 함수 포인터와 유사하기 때문에 형식이 안전한 함수 포인터로 설명되기도 합니다. 그러나 함수 포인터와 달리 Visual Basic 대리자는 클래스 System.Delegate를 기반으로 하는 참조 형식입니다. 대리자는 클래스의 특정 인스턴스 없이 호출할 수 있는 메서드인 공유 메서드와 인스턴스 메서드를 모두 참조할 수 있습니다.
대표자 및 행사
대리자는 호출 프로시저와 호출되는 프로시저 사이에 중개자가 필요한 경우에 유용합니다. 예를 들어 이벤트를 발생시키는 개체가 다른 상황에서 다른 이벤트 처리기를 호출할 수 있도록 할 수 있습니다. 아쉽게도 이벤트를 발생시키는 개체는 특정 이벤트를 처리하는 이벤트 처리기를 미리 알 수 없습니다. Visual Basic을 사용하면 AddHandler
문을 사용할 때 대리자를 생성하여 이벤트 처리기를 이벤트와 동적으로 연결할 수 있습니다. 런타임에 대리자는 적절한 이벤트 처리기에 호출을 전달합니다.
사용자 고유의 대리자를 만들 수 있지만 대부분의 경우 Visual Basic은 대리자를 만들고 세부 정보를 처리합니다. 예를 들어, Event
문은 <EventName>EventHandler
문을 포함하는 클래스의 중첩된 클래스이자 이벤트와 동일한 시그니처를 가지는 대리자 클래스로 암시적으로 Event
이라고 명명된 클래스를 정의합니다. 이 문장은 AddressOf
특정 프로시저를 참조하는 대리자의 인스턴스를 암시적으로 만듭니다. 다음 두 줄의 코드는 동일합니다. 첫 번째 줄에는 인수로 전송된 메서드 EventHandler
에 대한 참조와 함께 인스턴스Button1_Click
의 명시적 생성이 표시됩니다. 두 번째 줄은 동일한 작업을 수행하는 더 편리한 방법입니다.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
' The following line of code is shorthand for the previous line.
AddHandler Button1.Click, AddressOf Me.Button1_Click
컴파일러가 컨텍스트별로 대리자의 형식을 확인할 수 있는 모든 위치에서 대리자를 만드는 약식 방법을 사용할 수 있습니다.
기존 대리자 형식을 사용하는 이벤트 선언
경우에 따라 기존 대리자 형식을 기본 대리자로 사용하도록 이벤트를 선언할 수 있습니다. 다음 구문은 방법을 보여 줍니다.
Delegate Sub DelegateType()
Event AnEvent As DelegateType
여러 이벤트를 동일한 처리기로 라우팅하려는 경우에 유용합니다.
대리자 변수 및 매개 변수
무료 스레딩 또는 런타임에 다른 버전의 함수를 호출해야 하는 프로시저와 같은 기타 비 이벤트 관련 작업에 대리자를 사용할 수 있습니다.
예를 들어 자동차 이름이 포함된 목록 상자가 포함된 분류 광고 애플리케이션이 있다고 가정해 보겠습니다. 광고는 일반적으로 자동차의 메이크인 제목별로 정렬됩니다. 당신이 직면 할 수있는 문제는 일부 자동차가 만들기 전에 자동차의 연도를 포함 할 때 발생합니다. 문제는 목록 상자의 기본 제공 정렬 기능이 문자 코드로만 정렬된다는 것입니다. 날짜부터 시작하는 모든 광고를 먼저 배치한 다음, 메이크로 시작하는 광고를 배치합니다.
이 문제를 해결하려면 대부분의 목록 상자에서 표준 사전순 정렬을 사용하지만 런타임에 자동차 광고에 대한 사용자 지정 정렬 프로시저로 전환할 수 있는 클래스에서 정렬 프로시저를 만들 수 있습니다. 이렇게 하려면 대리자를 사용하여 런타임에 정렬 클래스에 사용자 지정 정렬 프로시저를 전달합니다.
AddressOf 연산자와 람다 식
각 대리자 클래스는 개체 메서드의 사양에 전달되는 생성자를 정의합니다. 대리자 생성자에 대한 인수는 메서드 또는 람다 식에 대한 참조여야 합니다.
메서드에 대한 참조를 지정하려면 다음 구문을 사용합니다.
AddressOf
[expression
.]methodName
컴파일 시간 형식 expression
은 시그니처가 대리자 클래스의 서명과 일치하는 지정된 이름의 메서드를 포함하는 클래스의 이름 또는 인터페이스여야 합니다. 공유 methodName
메서드 또는 인스턴스 메서드일 수 있습니다. 클래스의 methodName
기본 메서드에 대한 대리자를 만드는 경우에도 선택 사항이 아닙니다.
람다 식을 지정하려면 다음 구문을 사용합니다.
Function
([parm
As type
, parm2
As type2
, ...]) expression
다음 예제에서는 대리자의 참조를 지정하는 데 사용되는 AddressOf
및 람다 식을 모두 보여 줍니다.
Module Module1
Sub Main()
' Create an instance of InOrderClass and assign values to the properties.
' InOrderClass method ShowInOrder displays the numbers in ascending
' or descending order, depending on the comparison method you specify.
Dim inOrder As New InOrderClass
inOrder.Num1 = 5
inOrder.Num2 = 4
' Use AddressOf to send a reference to the comparison function you want
' to use.
inOrder.ShowInOrder(AddressOf GreaterThan)
inOrder.ShowInOrder(AddressOf LessThan)
' Use lambda expressions to do the same thing.
inOrder.ShowInOrder(Function(m, n) m > n)
inOrder.ShowInOrder(Function(m, n) m < n)
End Sub
Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
Return num1 > num2
End Function
Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
Return num1 < num2
End Function
Class InOrderClass
' Define the delegate function for the comparisons.
Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
' Display properties in ascending or descending order.
Sub ShowInOrder(ByVal compare As CompareNumbers)
If compare(_num1, _num2) Then
Console.WriteLine(_num1 & " " & _num2)
Else
Console.WriteLine(_num2 & " " & _num1)
End If
End Sub
Private _num1 As Integer
Property Num1() As Integer
Get
Return _num1
End Get
Set(ByVal value As Integer)
_num1 = value
End Set
End Property
Private _num2 As Integer
Property Num2() As Integer
Get
Return _num2
End Get
Set(ByVal value As Integer)
_num2 = value
End Set
End Property
End Class
End Module
함수의 서명은 대리자 형식의 서명과 일치해야 합니다. 람다 식에 대한 자세한 내용은 람다 식을 참조하세요. 람다 식 및 AddressOf
대리자 할당에 대한 자세한 예는 완화된 대리자 변환을 참조하세요.
관련 항목
제목 | 설명 |
---|---|
방법: 대리자 메서드 호출 | 메서드를 대리자와 연결한 다음 대리자를 통해 해당 메서드를 호출하는 방법을 보여 주는 예제를 제공합니다. |
방법: Visual Basic의 다른 프로시저에 프로시저 전달 | 대리자를 사용하여 한 프로시저를 다른 프로시저에 전달하는 방법을 보여 줍니다. |
완화된 대리자 변환 | 서명이 동일하지 않은 경우에도 대리자 또는 처리기에 하위 및 함수를 할당하는 방법을 설명합니다. |
이벤트 | Visual Basic의 이벤트에 대한 개요를 제공합니다. |
.NET