Delegate 클래스

2013-12-13

대리자는 정적 메서드 또는 클래스 인스턴스 및 해당 클래스의 인스턴스 메서드를 참조하는 데이터 구조입니다.

Namespace:  System
어셈블리:  mscorlib(mscorlib.dll)

public abstract class Delegate

Delegate 형식에서는 다음과 같은 멤버를 노출합니다.

  이름설명
Public 속성Method대리자가 나타내는 메서드를 가져옵니다.
Public 속성Target현재 대리자가 인스턴스 메서드를 호출하는 클래스 인스턴스를 가져옵니다.
맨 위

  이름설명
Public 메서드정적 멤버Combine(Delegate[])대리자 배열의 호출 목록을 연결합니다.
Public 메서드정적 멤버Combine(Delegate, Delegate)두 대리자의 호출 목록을 연결합니다.
Protected 메서드CombineImpl지정된 대리자 및 현재 대리자의 호출 목록을 연결합니다.
Public 메서드정적 멤버CreateDelegate(Type, MethodInfo)지정된 정적 메서드를 나타내기 위해서 지정된 형식의 대리자를 만듭니다.
Public 메서드정적 멤버CreateDelegate(Type, Object, MethodInfo)지정한 첫 번째 인수를 사용하여 지정한 정적 또는 인스턴스 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.
Public 메서드정적 멤버CreateDelegate(Type, Object, String)지정된 클래스 인스턴스에서 호출하는 지정된 인스턴스 메서드를 나타내는 지정된 형식의 대리자를 만듭니다.
Public 메서드정적 멤버CreateDelegate(Type, MethodInfo, Boolean)바인딩 실패 시 지정한 동작을 기반으로 지정한 정적 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.
Public 메서드정적 멤버CreateDelegate(Type, Type, String)지정된 클래스의 지정된 정적 메서드를 나타내는 지정된 형식의 대리자를 만듭니다.
Public 메서드정적 멤버CreateDelegate(Type, Object, MethodInfo, Boolean)지정한 첫 번째 인수와 바인딩 실패 시 지정한 동작을 기반으로 지정한 정적 또는 인스턴스 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.
Public 메서드정적 멤버CreateDelegate(Type, Object, String, Boolean)지정된 대/소문자 구분 여부를 기반으로 지정된 클래스 인스턴스에서 호출하는 지정된 인스턴스 메서드를 나타내는 지정된 형식의 대리자를 만듭니다.
Public 메서드정적 멤버CreateDelegate(Type, Type, String, Boolean)지정한 대/소문자 구분 여부를 기반으로 지정한 클래스의 지정한 정적 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.
Public 메서드정적 멤버CreateDelegate(Type, Object, String, Boolean, Boolean)지정한 대/소문자 구분과 바인딩 실패 시 지정한 동작을 기반으로 지정한 클래스 인스턴스에서 호출하는 지정한 인스턴스 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.
Public 메서드정적 멤버CreateDelegate(Type, Type, String, Boolean, Boolean)지정한 대/소문자 구분과 바인딩 실패 시 지정한 동작을 기반으로 지정한 클래스의 지정한 정적 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.
Public 메서드DynamicInvoke현재 대리자가 나타내는 메서드를 동적으로 호출(런타임에 바인딩)합니다.
Public 메서드Equals지정한 개체와 현재 대리자가 같은 형식이고 같은 대상, 메서드 및 호출 목록을 공유하는지 여부를 확인합니다. (Object.Equals(Object)을(를) 재정의함)
Protected 메서드Finalize가비지 수집기에서 Object를 회수하기 전에 개체가 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다. (Object에서 상속됨)
Public 메서드GetHashCode대리자의 해시 코드를 반환합니다. (Object.GetHashCode()을(를) 재정의함)
Public 메서드GetInvocationList대리자의 호출 목록을 반환합니다.
Public 메서드GetType현재 인스턴스의 Type을 가져옵니다. (Object에서 상속됨)
Protected 메서드MemberwiseClone현재 Object의 단순 복사본을 만듭니다. (Object에서 상속됨)
Public 메서드정적 멤버Remove한 대리자의 호출 목록에 있는 마지막 항목을 다른 대리자의 호출 목록에서 제거합니다.
Public 메서드정적 멤버RemoveAll한 대리자의 호출 목록에 있는 모든 항목을 다른 대리자의 호출 목록에서 제거합니다.
Protected 메서드RemoveImpl한 대리자의 호출 목록을 다른 대리자의 호출 목록에서 제거합니다.
Public 메서드ToString현재 개체를 나타내는 문자열을 반환합니다. (Object에서 상속됨)
맨 위

  이름설명
Public 연산자정적 멤버Equality지정된 대리자가 같은지를 확인합니다.
Public 연산자정적 멤버Inequality지정된 대리자가 다른지를 확인합니다.
맨 위

  이름설명
Public 확장 메서드GetMethodInfo지정된 대리자가 나타내는 메서드를 나타내는 개체를 가져옵니다. (RuntimeReflectionExtensions에서 정의됨)
맨 위

Delegate 클래스는 대리자 형식의 기본 클래스입니다. 하지만 시스템과 컴파일러만이 Delegate 클래스와 MulticastDelegate 클래스로부터 명시적으로 파생시킬 수 있습니다. 또한 대리자 형식에서 새로운 형식을 파생할 수 없습니다. Delegate 클래스는 대리자 형식으로 간주되지 않으며 대리자 형식을 파생하기 위해 이용되는 클래스입니다.

대부분 언어들은 delegate 키워드를 구현하고 해당 언어의 컴파일러는 또한 MulticastDelegate 클래스에서 파생 시킬 수 있습니다. 그러므로 사용자는 언어에서 제공하는 delegate 키워드를 사용해야 합니다.

참고참고:

공용 언어 런타임은 대리자와 동일한 서명을 사용하여 각 대리자 형식에 Invoke 메서드를 제공합니다. 컴파일러는 자동으로 호출하기 때문에 이 메서드는 C# 또는 Visual Basic에서 명시적으로 호출할 필요가 없습니다. Invoke 메서드는 대리자 형식의 서명을 찾으려는 경우 리플렉션에서 유용합니다.

대리자 형식을 선언하면 하나 이상의 메서드의 서명을 지정하는 계약 파일을 만듭니다. 대리자는 다음 중 하나에 대한 참조가 있는 대리자 형식의 인스턴스입니다.

  • 형식의 인스턴스 메서드와 해당 형식에 할당할 수 있는 대상 개체

  • 숨겨진 this 매개 변수가 정식 매개 변수 목록에서 노출되는, 형식의 인스턴스 메서드. 해당 대리자를 열린 인스턴스 대리자라고 합니다.

  • 정적 메서드

  • 정적 메서드와 해당 메서드의 첫 번째 매개 변수에 할당할 수 있는 대상 개체. 해당 대리자를 첫 번째 인수에 대해 닫혀 있다고 합니다.

이러한 시나리오에서의 대리자 바인딩 예제는 CreateDelegate(Type, Object, MethodInfo, Boolean) 메서드 오버로드를 참조하세요.

대리자가 첫 번째 인수에 대해 닫혀 있는 인스턴스 메서드를 나타낼 경우(가장 일반적인 경우), 이 대리자는 메서드의 진입점에 대한 참조와 메서드가 정의된 형식에 할당할 수 있는 형식의 개체(대상 개체)에 대한 참조를 저장합니다. 대리자가 열린 인스턴스 메서드를 나타낼 경우, 이 대리자는 메서드의 진입점에 대한 참조를 저장합니다. 대리자 서명에는 정식 매개 변수 목록의 숨겨진 this 매개 변수가 포함되어야 합니다. 이 경우 대리자에는 대상 개체에 대한 참조가 없으므로 대리자를 호출할 때 대상 개체를 제공해야 합니다.

대리자가 정적 메서드를 나타낼 경우, 이 대리자는 메서드의 진입점에 대한 참조를 저장합니다. 대리자가 첫 번째 인수에 대해 닫혀 있는 정적 메서드를 나타낼 경우, 이 대리자는 메서드의 진입점에 대한 참조와 메서드의 첫 번째 인수의 형식에 할당할 수 있는 대상 개체에 대한 참조를 저장합니다. 대리자가 호출되면 정적 메서드의 첫 번째 인수가 대상 개체를 받습니다.

대리자의 호출 목록은 정렬된 대리자의 집합이며 목록의 각 요소는 대리자가 나타내는 메서드 중 정확히 하나를 호출합니다. 호출 목록은 중복 메서드를 포함할 수 있습니다. 호출하는 동안 메서드는 호출 목록에 나타난 순서대로 호출됩니다. 대리자는 호출 목록의 모든 메서드를 호출하려고 하며, 중복된 메서드는 호출 목록에 표시될 때마다 호출됩니다. 대리자는 변경할 수 없으며 일단 만들어지면 대리자의 호출 목록은 바뀌지 않습니다.

대리자는 하나 이상의 메서드를 호출할 수 있고 결합하는 연산에 사용될 수 있으므로 멀티캐스트 대리자와 결합할 수 있는 대리자로 분류됩니다.

CombineRemove와 같은 결합하는 연산은 기존의 대리자를 변경하지 않습니다. 대신 그러한 연산은 연산의 결과인 바뀌지 않은 대리자나 null을 포함하는 새로운 대리자를 반환합니다. 연산의 결과가 한 메서드도 참조하지 않는 대리자일 경우 결합하는 연산은 null을 반환합니다. 요청된 연산이 아무 영향이 없으면 결합하는 연산은 바뀌지 않은 대리자를 반환합니다.

호출된 메서드가 예외를 발생시키면 메서드는 실행을 멈추고 예외는 대리자의 호출자에게 전달됩니다. 그리고 호출 목록에 남아있는 메서드는 호출되지 않습니다. 호출자 안에서 예외를 catch해도 이 동작은 변하지 않습니다.

대리자에 의해서 호출된 메서드의 서명에 반환 값이 포함될 때 대리자는 호출 목록의 마지막 요소의 반환 값을 반환합니다. 서명에 참조로 전달되는 매개 변수가 포함될 때, 매개 변수의 마지막 값은 순서대로 실행하고 매개 변수의 값을 업데이트하는 호출 목록의 모든 메서드의 결과입니다.

C 또는 C++에서 대리자와 가장 비슷한 것은 함수 포인터입니다. 대리자는 정적 메서드 또는 인스턴스 메서드를 나타냅니다. 대리자가 인스턴스 메서드를 나타내는 경우 메서드의 진입점뿐만 아니라 클래스 인스턴스에 대한 참조도 저장합니다. 함수 포인터와는 달리 대리자는 개체 지향적이고 형식이 안전합니다.

모든 대리자 형식에서 자동으로 정의되는 BeginInvoke 메서드가 항상 NotSupportedException을 발생시키므로 이 메서드를 사용하여 스레드 풀 스레드에 대해 비동기적 메서드 호출을 수행할 수 없습니다. Dispatcher.BeginInvoke(Delegate, Object[]) 메서드 오버로드를 사용하여 System.Windows.Threading.Dispatcher 개체가 연결되어 있는 스레드에 대해 메서드를 실행할 수는 있지만, 이 기술은 런타임 바인딩을 사용하며 스레드 풀 스레드를 사용하지 않습니다.

플랫폼 참고 사항

 멀티캐스트 가상 함수 조회 대리자는 Windows Phone 7에서 NullReferenceException을 발생시키지만 Windows Phone OS 7.1에서는 AccessViolationException을 발생시킵니다.

다음 예제는 myMethodDelegate라는 대리자를 정의하는 방법을 보여 줍니다. 이러한 대리자의 인스턴스가 중첩된 mySampleClass 클래스의 인스턴스 메서드와 정적 메서드용으로 만들어집니다. 인스턴스 메서드의 대리자는 mySampleClass의 인스턴스가 있어야 합니다. mySampleClass 인스턴스는 mySC라는 변수에 저장됩니다.

참고참고:

이 예제를 실행하려면 Windows Phone용 정적 TextBlock 컨트롤이 있는 예제 빌드를 참조하세요.


using System;
public class Example
{

   // Declares a delegate for a method that takes in an int and returns a String.
   public delegate String myMethodDelegate(int myInt);

   // Defines some methods to which the delegate can point.
   public class mySampleClass
   {

      // Defines an instance method.
      public String myStringMethod(int myInt)
      {
         if (myInt > 0)
            return ("positive");
         if (myInt < 0)
            return ("negative");
         return ("zero");
      }

      // Defines a static method.
      public static String mySignMethod(int myInt)
      {
         if (myInt > 0)
            return ("+");
         if (myInt < 0)
            return ("-");
         return ("");
      }
   }

   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {

      // Creates one delegate for each method. For the instance method, an
      // instance (mySC) must be supplied. For the static method, use the
      // class name.
      mySampleClass mySC = new mySampleClass();
      myMethodDelegate myD1 = new myMethodDelegate(mySC.myStringMethod);
      myMethodDelegate myD2 = new myMethodDelegate(mySampleClass.mySignMethod);

      // Invokes the delegates.
      outputBlock.Text += String.Format("{0} is {1}; use the sign \"{2}\".", 5, myD1(5), myD2(5)) + "\n";
      outputBlock.Text += String.Format("{0} is {1}; use the sign \"{2}\".", -3, myD1(-3), myD2(-3)) + "\n";
      outputBlock.Text += String.Format("{0} is {1}; use the sign \"{2}\".", 0, myD1(0), myD2(0)) + "\n";
   }

}


/*
This code produces the following output:

5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/



Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

이 형식의 모든 공용 static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버는 스레드로부터 안전하지 않을 수 있습니다.

표시:
© 2014 Microsoft