공용 형식 시스템의 대리자
업데이트: 2007년 11월
런타임에서는 C++의 함수 포인터와 비슷한 목적으로 사용되는 대리자라는 참조 형식을 지원합니다. 함수 포인터와 달리 대리자는 안전하고, 확인할 수 있으며, 형식이 안전합니다. 대리자 형식은 호환되는 시그니처로 모든 메서드를 나타낼 수 있습니다. 함수 포인터가 정적 함수만을 나타낼 수 있는 반면, 대리자는 정적 메서드와 인스턴스 메서드를 모두 나타낼 수 있습니다. 대리자는 .NET Framework의 이벤트 처리기와 콜백 함수를 위해 사용됩니다.
참고: |
---|
공용 언어 런타임에서는 전역 메서드의 serialization을 지원하지 않으므로 다른 응용 프로그램 도메인에서 대리자를 사용하여 전역 메서드를 실행할 수 없습니다. |
모든 대리자는 Delegate에서 상속받는 MulticastDelegate에서 상속됩니다. C#, Visual Basic 및 C++ 언어에서는 이러한 형식에서 상속받는 것을 허용하지 않으며, 대신 대리자를 선언하기 위한 키워드를 제공합니다.
상속된 메서드 외에도 공용 언어 런타임은 대리자 형식에 대해 BeginInvoke 및 EndInvoke라는 두 가지 특별한 메서드를 제공합니다. 이러한 메서드에 대한 자세한 내용은 동기 메서드를 비동기 방식으로 호출을 참조하십시오.
대리자는 MulticastDelegate에서 상속하기 때문에 대리자에는 호출 목록이 있습니다. 이 목록에는 대리자가 나타내는 메서드와 대리자가 호출될 때 실행되는 메서드가 표시됩니다. 이 목록의 모든 메서드는 대리자가 호출될 때 제공되는 인수를 받습니다.
참고: |
---|
호출 목록에 하나 이상의 메서드가 있는 대리자에 대해서는 반환 형식을 가지고 있더라도 반환 값이 정의되지 않습니다. |
대리자 만들기 및 사용
대부분의 경우 콜백 메서드와 같이 대리자는 하나의 메서드만 나타내며, 대리자를 만들고 호출하는 것 외에는 필요한 작업이 없습니다.
여러 메서드를 나타내는 대리자의 경우, .NET Framework에서는 Delegate 및 MulticastDelegate 대리자 클래스의 메서드를 제공하여 대리자 호출 목록에 메서드 추가(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에 속한 스레드에서 실행됩니다.
자세한 내용과 예제 코드는 대리자를 사용한 비동기 프로그래밍을 참조하십시오.