공용 형식 시스템의 대리자

업데이트: 2007년 11월

런타임에서는 C++의 함수 포인터와 비슷한 목적으로 사용되는 대리자라는 참조 형식을 지원합니다. 함수 포인터와 달리 대리자는 안전하고, 확인할 수 있으며, 형식이 안전합니다. 대리자 형식은 호환되는 시그니처로 모든 메서드를 나타낼 수 있습니다. 함수 포인터가 정적 함수만을 나타낼 수 있는 반면, 대리자는 정적 메서드와 인스턴스 메서드를 모두 나타낼 수 있습니다. 대리자는 .NET Framework의 이벤트 처리기와 콜백 함수를 위해 사용됩니다.

참고:

공용 언어 런타임에서는 전역 메서드의 serialization을 지원하지 않으므로 다른 응용 프로그램 도메인에서 대리자를 사용하여 전역 메서드를 실행할 수 없습니다.

모든 대리자는 Delegate에서 상속받는 MulticastDelegate에서 상속됩니다. C#, Visual Basic 및 C++ 언어에서는 이러한 형식에서 상속받는 것을 허용하지 않으며, 대신 대리자를 선언하기 위한 키워드를 제공합니다.

상속된 메서드 외에도 공용 언어 런타임은 대리자 형식에 대해 BeginInvoke 및 EndInvoke라는 두 가지 특별한 메서드를 제공합니다. 이러한 메서드에 대한 자세한 내용은 동기 메서드를 비동기 방식으로 호출을 참조하십시오.

대리자는 MulticastDelegate에서 상속하기 때문에 대리자에는 호출 목록이 있습니다. 이 목록에는 대리자가 나타내는 메서드와 대리자가 호출될 때 실행되는 메서드가 표시됩니다. 이 목록의 모든 메서드는 대리자가 호출될 때 제공되는 인수를 받습니다.

참고:

호출 목록에 하나 이상의 메서드가 있는 대리자에 대해서는 반환 형식을 가지고 있더라도 반환 값이 정의되지 않습니다.

대리자 만들기 및 사용

대부분의 경우 콜백 메서드와 같이 대리자는 하나의 메서드만 나타내며, 대리자를 만들고 호출하는 것 외에는 필요한 작업이 없습니다.

여러 메서드를 나타내는 대리자의 경우, .NET Framework에서는 DelegateMulticastDelegate 대리자 클래스의 메서드를 제공하여 대리자 호출 목록에 메서드 추가(Delegate.Combine 메서드), 메서드 제거(Delegate.Remove 메서드), 호출 목록 가져오기(Delegate.GetInvocationList 메서드) 등과 같은 작업을 지원합니다.

참고:

C#, C++ 및 Visual Basic에서는 이벤트 처리기 대리자에 대해 이러한 메서드를 사용할 필요가 없습니다. 이 언어들은 이벤트 처리기를 추가하고 제거하기 위한 구문을 제공합니다.

닫힌 정적 대리자 및 열린 인스턴스 대리자

대리자는 static(Visual Basic에서는 Shared) 메서드나 인스턴스 메서드를 나타낼 수 있습니다. 일반적으로 대리자가 인스턴스 메서드를 나타내는 경우, 인스턴스가 메서드와 함께 대리자에 바인딩됩니다. 예를 들어, 이벤트 처리기 대리자의 호출 목록에 세 개의 인스턴스 메서드가 있고, 각 메서드는 자신이 속한 개체에 대한 참조를 갖을 수 있습니다.

.NET Framework 버전 2.0에서는 인스턴스 메서드에 대해 열린 대리자를 만드는 것도 가능합니다. 인스턴스 메서드에 C#의 this나 Visual Basic의 Me로 나타내는 암시적 인스턴스 매개 변수가 있고, 이는 이 숨겨진 매개 변수를 노출하는 대리자 형식으로 나타낼 수 있습니다. 즉, 대리자 형식의 정식 매개 변수 목록 시작 부분에는 메서드가 속한 클래스와 같은 형식의 추가 매개 변수가 있어야 합니다. 이 시나리오와 반대의 경우도 지원되므로 정적 메서드의 첫 번째 인수를 바인딩할 수 있습니다.

참고:

열린 인스턴스 및 닫힌 정적 대리자 만들기는 대리자 생성자에 대한 Visual Basic, C++ 또는 C#에 의해 직접 지원되지 않습니다. 대신 Delegate.CreateDelegate(Type, Object, MethodInfo, Boolean)와 같은 MethodInfo 개체를 지정하는 Delegate.CreateDelegate 메서드 오버로드 중 하나를 사용합니다.

대리자 바인딩에 대한 관대한 규칙

.NET Framework 버전 2.0의 경우 대리자의 매개 변수 형식 및 반환 형식이 대리자가 나타내는 메서드의 매개 변수 형식 및 반환 형식과 호환되어야 합니다. 그러나 이러한 형식이 정확하게 일치할 필요는 없습니다.

참고:

.NET Framework 버전 1.0 및 1.1에서는 형식이 정확하게 일치해야 합니다.

대리자 매개 변수의 형식이 메서드 매개 변수의 형식보다 좀 더 제한적인 경우 대리자에 전달된 인수가 메서드로 안전하게 전달될 수 있으므로, 대리자의 매개 변수가 메서드의 해당되는 매개 변수와 호환됩니다.

마찬가지로, 메서드의 반환 형식이 대리자의 반환 형식보다 좀 더 제한적인 경우 메서드의 반환 값이 대리자의 반환 형식으로 안전하게 캐스팅될 수 있으므로, 대리자의 반환 형식이 메서드의 반환 형식과 호환됩니다.

예를 들어, Hashtable 형식의 매개 변수와 Object의 반환 형식을 갖는 대리자는 Object 형식의 매개 변수와 Hashtable 형식의 반환 값을 갖는 메서드를 나타낼 수 있습니다.

자세한 내용과 예제 코드는 Delegate.CreateDelegate(Type, Object, MethodInfo)를 참조하십시오.

대리자 및 비동기 메서드 호출

모든 대리자에에는 대리자를 비동기적으로 호출할 수 있는 BeginInvoke 메서드와 나중에 리소스를 정리하는 EndInvoke 메서드가 있습니다. 이러한 메서드는 각 대리자 형식에 대해 자동으로 생성됩니다. BeginInvoke 메서드를 사용하여 대리자를 호출할 경우, 대리자가 나타내는 메서드가 ThreadPool에 속한 스레드에서 실행됩니다.

자세한 내용과 예제 코드는 대리자를 사용한 비동기 프로그래밍을 참조하십시오.

참고 항목

개념

이벤트 사용

이벤트 및 대리자

참조

System.Delegate

System.EventHandler

기타 리소스

공용 형식 시스템

대리자를 사용한 비동기 프로그래밍