Delegate 클래스

정의

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

public ref class Delegate abstract
public ref class Delegate abstract : ICloneable, System::Runtime::Serialization::ISerializable
public abstract class Delegate
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Delegate = class
    interface ICloneable
    interface ISerializable
Public MustInherit Class Delegate
Public MustInherit Class Delegate
Implements ICloneable, ISerializable
상속
Delegate
파생
특성
구현

예제

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

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

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

   // Defines an instance method.
   String^ myStringMethod( int myInt )
   {
      if ( myInt > 0 )
            return ("positive");

      if ( myInt < 0 )
            return ("negative");

      return ("zero");
   }


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

      if ( myInt < 0 )
            return ("-");

      return ("");
   }

};

int main()
{
   
   // Creates one delegate for each method. For the instance method, an 
   // instance (mySC) must be supplied. For the static method, only the
   // method name is needed.
   mySampleClass^ mySC = gcnew mySampleClass;
   myMethodDelegate^ myD1 = gcnew myMethodDelegate( mySC, &mySampleClass::myStringMethod );
   myMethodDelegate^ myD2 = gcnew myMethodDelegate( mySampleClass::mySignMethod );
   
   // Invokes the delegates.
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".",  -3, myD1(  -3 ), myD2(  -3 ) );
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
}

/*
This code produces the following output:

5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/
using System;
public class SamplesDelegate  {

   // 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 Main()  {

      // 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.
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
   }
}


/*
This code produces the following output:

5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/
// Declares a delegate for a method that takes in an int and returns a string.
type MyMethodDelegate = delegate of int -> string

// Defines some methods to which the delegate can point.
type MySampleClass() =
    // Defines an instance method.
    member _.MyStringMethod(myInt) =
        if myInt > 0 then "positive"
        elif myInt < 0 then "negative"
        else "zero"

    // Defines a static method.
    static member MySignMethod(myInt) =
        if myInt > 0 then "+"
        elif myInt < 0 then "-"
        else ""

// Creates one delegate for each method. For the instance method, an
// instance (mySC) must be supplied. For the static method, use the
// class name.
let mySC = MySampleClass()
let myD1 = MyMethodDelegate mySC.MyStringMethod
let myD2 = MyMethodDelegate MySampleClass.MySignMethod

// Invokes the delegates.
printfn $"{5} is {myD1.Invoke 5} use the sign \"{myD2.Invoke 5}\"."
printfn $"{-3} is {myD1.Invoke -3} use the sign \"{myD2.Invoke -3}\"."
printfn $"{0} is {myD1.Invoke 0} use the sign \"{myD2.Invoke 0}\"."

// This code produces the following output:
//     5 is positive use the sign "+".
//     -3 is negative use the sign "-".
//     0 is zero use the sign "".
Public Class SamplesDelegate

   ' Declares a delegate for a method that takes in an int and returns a String.
   Delegate Function myMethodDelegate(myInt As Integer) As [String]

   ' Defines some methods to which the delegate can point.
   Public Class mySampleClass

      ' Defines an instance method.
      Public Function myStringMethod(myInt As Integer) As [String]
         If myInt > 0 Then
            Return "positive"
         End If
         If myInt < 0 Then
            Return "negative"
         End If
         Return "zero"
      End Function 'myStringMethod

      ' Defines a static method.
      Public Shared Function mySignMethod(myInt As Integer) As [String]
         If myInt > 0 Then
            Return "+"
         End If
         If myInt < 0 Then
            Return "-"
         End If
         Return ""
      End Function 'mySignMethod
   End Class

   Public Shared Sub Main()

      ' Creates one delegate for each method. For the instance method, an
      ' instance (mySC) must be supplied. For the Shared method, the
      ' method name is qualified by the class name.
      Dim mySC As New mySampleClass()
      Dim myD1 As New myMethodDelegate(AddressOf mySC.myStringMethod)
      Dim myD2 As New myMethodDelegate(AddressOf mySampleClass.mySignMethod)

      ' Invokes the delegates.
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".", 5, myD1(5), myD2(5))
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".", - 3, myD1(- 3), myD2(- 3))
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".", 0, myD1(0), myD2(0))

   End Sub

End Class


'This code produces the following output:
' 
'5 is positive; use the sign "+".
'-3 is negative; use the sign "-".
'0 is zero; use the sign "".

설명

Delegate 클래스는 대리자 형식에 대한 기본 클래스입니다. 그러나 시스템 및 컴파일러만 클래스 또는 클래스에서 Delegate 명시적으로 파생할 MulticastDelegate 수 있습니다. 대리자 형식에서 새 형식을 파생하는 것도 허용되지 않습니다. Delegate 클래스는 대리자 형식으로 간주되지 않으며 대리자 형식을 파생하는 데 사용되는 클래스입니다.

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

참고

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

공용 언어 런타임은 각 대리자 형식과 BeginInvoke EndInvoke 메서드를 제공하여 대리자의 비동기 호출을 사용하도록 설정합니다. 이러한 메서드에 대한 자세한 내용은 비동기적으로 동기 메서드 호출을 참조하세요.

대리자 형식의 선언은 하나 이상의 메서드의 서명을 지정하는 계약을 설정합니다. 대리자는 다음을 참조하는 대리자 형식의 인스턴스입니다.

  • 형식의 인스턴스 메서드 및 해당 형식에 할당할 수 있는 대상 개체입니다.

  • 형식 매개 변수 목록에 숨겨진 this 매개 변수가 노출되는 형식의 인스턴스 메서드입니다. 대리자는 개방형 인스턴스 대리자라고 합니다.

  • 정적 메서드입니다.

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

대리자 바인딩에 대한 자세한 내용은 메서드 오버로드를 CreateDelegate(Type, Object, MethodInfo, Boolean) 참조하세요.

참고

.NET Framework 버전 1.0 및 1.1에서 대리자는 메서드의 서명이 대리자 형식에서 지정한 서명과 정확히 일치하는 경우에만 메서드를 나타낼 수 있습니다. 따라서 이전 목록의 첫 번째 및 세 번째 글머리 기호만 지원되며 첫 번째 글머리 기호에는 정확한 형식 일치가 필요합니다.

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

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

대리자의 호출 목록은 목록의 각 요소가 대리자가 나타내는 메서드 중 하나만 호출하는 순서가 지정된 대리자 집합입니다. 호출 목록에는 중복 메서드가 포함될 수 있습니다. 호출하는 동안 메서드는 호출 목록에 표시되는 순서대로 호출됩니다. 대리자는 호출 목록의 모든 메서드를 호출하려고 합니다. 중복 항목은 호출 목록에 나타날 때마다 한 번씩 호출됩니다. 대리자는 변경할 수 없습니다. 생성되면 대리자의 호출 목록이 변경되지 않습니다.

대리자는 하나 이상의 메서드를 호출할 수 있고 작업을 결합하는 데 사용할 수 있으므로 대리자를 멀티캐스트 또는 결합 가능이라고 합니다.

같은 Combine Remove연산을 결합해도 기존 대리자는 변경되지 않습니다. 대신 이러한 작업은 작업의 결과, 변경되지 않은 대리자 또는 null새 대리자를 반환합니다. 결합 작업은 작업 결과가 하나 이상의 메서드를 참조하지 않는 대리자일 때 반환 null 됩니다. 결합 작업은 요청된 작업이 적용되지 않는 경우 변경되지 않은 대리자를 반환합니다.

참고

관리되는 언어는 대리자 작업을 구현하기 위해 및 Remove 메서드를 사용합니다Combine. 예를 들어 Visual Basic 및 RemoveHandler 문과 C#의 대리자 형식에 대한 += 및 -= 연산자가 있습니다AddHandler.

.NET Framework 4부터 제네릭 대리자 형식에는 변형 형식 매개 변수가 있을 수 있습니다. 반공변 형식 매개 변수는 대리자의 매개 변수 형식으로 사용할 수 있으며 공변 형식 매개 변수를 반환 형식으로 사용할 수 있습니다. 이 기능을 사용하면 동일한 제네릭 형식 정의에서 생성된 제네릭 대리자 형식이 공변성 및 반공변성에 설명된 대로 해당 형식 인수가 상속 관계가 있는 참조 형식인 경우 할당 호환이 가능합니다.

참고

분산으로 인해 할당 호환되는 제네릭 대리자는 반드시 결합할 수 있는 것은 아닙니다. 결합 가능하려면 형식이 정확히 일치해야 합니다. 예를 들어 명명된 클래스가 명명 Derived Base된 클래스에서 파생되었다고 가정합니다. 형식 Action<Base> 의 대리자(Action(Of Base)Visual Basic)를 형식 Action<Derived>변수에 할당할 수 있지만 형식이 정확히 일치하지 않으므로 두 대리자를 결합할 수 없습니다.

호출된 메서드가 예외를 throw하면 메서드 실행이 중지되고, 예외가 대리자의 호출자에게 다시 전달되고, 호출 목록의 나머지 메서드는 호출되지 않습니다. 호출자에서 예외를 catch해도 이 동작은 변경되지 않습니다.

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

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

생성자

Delegate(Object, String)

지정된 클래스 인스턴스에서 지정된 인스턴스 메서드를 호출하는 대리자를 초기화합니다.

Delegate(Type, String)

지정된 클래스에서 지정된 정적 메서드를 호출하는 대리자를 초기화합니다.

속성

Method

대리자가 나타내는 메서드를 가져옵니다.

Target

현재 대리자가 인스턴스 메서드를 호출하는 클래스 인스턴스를 가져옵니다.

메서드

Clone()

대리자의 부분 복사본을 만듭니다.

Combine(Delegate, Delegate)

두 대리자의 호출 목록을 연결합니다.

Combine(Delegate[])

대리자 배열의 호출 목록을 연결합니다.

CombineImpl(Delegate)

지정된 결합할 수 있는 멀티캐스트 대리자와 현재 결합할 수 있는 멀티캐스트 대리자의 호출 목록을 연결합니다.

CreateDelegate(Type, MethodInfo)

지정된 정적 메서드를 나타내기 위해서 지정된 형식의 대리자를 만듭니다.

CreateDelegate(Type, MethodInfo, Boolean)

바인딩 실패 시 지정한 동작을 기반으로 지정한 정적 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.

CreateDelegate(Type, Object, MethodInfo)

지정한 첫 번째 인수를 사용하여 지정한 정적 또는 인스턴스 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.

CreateDelegate(Type, Object, MethodInfo, Boolean)

지정한 첫 번째 인수와 바인딩 실패 시 지정한 동작을 기반으로 지정한 정적 또는 인스턴스 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.

CreateDelegate(Type, Object, String)

지정된 클래스 인스턴스에서 호출하는 지정된 인스턴스 메서드를 나타내는 지정된 형식의 대리자를 만듭니다.

CreateDelegate(Type, Object, String, Boolean)

지정된 대/소문자 구분 여부를 기반으로 지정된 클래스 인스턴스에서 호출하는 지정된 인스턴스 메서드를 나타내는 지정된 형식의 대리자를 만듭니다.

CreateDelegate(Type, Object, String, Boolean, Boolean)

지정한 대/소문자 구분과 바인딩 실패 시 지정한 동작을 기반으로 지정한 클래스 인스턴스에서 호출하는 지정한 인스턴스 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.

CreateDelegate(Type, Type, String)

지정된 클래스의 지정된 정적 메서드를 나타내는 지정된 형식의 대리자를 만듭니다.

CreateDelegate(Type, Type, String, Boolean)

지정한 대/소문자 구분 여부를 기반으로 지정한 클래스의 지정한 정적 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.

CreateDelegate(Type, Type, String, Boolean, Boolean)

지정한 대/소문자 구분과 바인딩 실패 시 지정한 동작을 기반으로 지정한 클래스의 지정한 정적 메서드를 나타내는 지정한 형식의 대리자를 만듭니다.

DynamicInvoke(Object[])

현재 대리자가 나타내는 메서드를 동적으로 호출(런타임에 바인딩)합니다.

DynamicInvokeImpl(Object[])

현재 대리자가 나타내는 메서드를 동적으로 호출(런타임에 바인딩)합니다.

Equals(Object)

지정한 개체와 현재 대리자가 같은 형식이고 같은 대상, 메서드 및 호출 목록을 공유하는지를 확인합니다.

GetHashCode()

대리자의 해시 코드를 반환합니다.

GetInvocationList()

대리자의 호출 목록을 반환합니다.

GetMethodImpl()

현재 대리자가 나타내는 정적 메서드를 가져옵니다.

GetObjectData(SerializationInfo, StreamingContext)

지원되지 않습니다.

GetType()

현재 인스턴스의 Type을 가져옵니다.

(다음에서 상속됨 Object)
MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.

(다음에서 상속됨 Object)
Remove(Delegate, Delegate)

한 대리자의 호출 목록에 있는 마지막 항목을 다른 대리자의 호출 목록에서 제거합니다.

RemoveAll(Delegate, Delegate)

한 대리자의 호출 목록에 있는 모든 항목을 다른 대리자의 호출 목록에서 제거합니다.

RemoveImpl(Delegate)

한 대리자의 호출 목록을 다른 대리자의 호출 목록에서 제거합니다.

ToString()

현재 개체를 나타내는 문자열을 반환합니다.

(다음에서 상속됨 Object)

연산자

Equality(Delegate, Delegate)

지정된 대리자가 같은지를 확인합니다.

Inequality(Delegate, Delegate)

지정된 대리자가 다른지를 확인합니다.

확장 메서드

GetMethodInfo(Delegate)

지정된 대리자가 나타내는 메서드를 나타내는 개체를 가져옵니다.

적용 대상

추가 정보