다음을 통해 공유


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
파생
특성
구현

설명

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

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

메모

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

공용 언어 런타임은 대리자를 비동기 호출할 수 있도록 각 대리자 형식에 BeginInvokeEndInvoke 메서드를 제공합니다. 이러한 메서드에 대한 자세한 내용은 동기 메서드를 비동기적으로 호출하는 참조하세요.

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

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

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

  • 정적 메서드입니다.

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

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

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

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

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

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

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

메모

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

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

메모

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

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

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

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

예를 들어 System.Delegate.CreateDelegate대한 추가 API 비고를 참조하세요.

생성자

Delegate(Object, String)

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

Delegate(Type, String)

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

속성

HasSingleTarget

Delegate 단일 호출 대상이 있는지 여부를 나타내는 값을 가져옵니다.

Method

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

Target

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

메서드

Clone()

대리자의 단순 복사본을 만듭니다.

Combine(Delegate, Delegate)

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

Combine(Delegate[])

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

Combine(ReadOnlySpan<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[])

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

EnumerateInvocationList<TDelegate>(TDelegate)

이 대리자의 호출 대상에 대한 열거자를 가져옵니다.

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)

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

적용 대상

추가 정보