Freigeben über


Delegate Klasse

Definition

Stellt einen Delegaten dar, bei dem es sich um eine Datenstruktur handelt, die sich auf eine statische Methode oder auf eine Klasseninstanz und eine Instanzmethode dieser Klasse bezieht.

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
Vererbung
Delegate
Abgeleitet
Attribute
Implementiert

Hinweise

Die Delegate Klasse ist die Basisklasse für Delegattypen. Allerdings können nur das System und die Compiler explizit von der Delegate-Klasse oder von der MulticastDelegate-Klasse abgeleitet werden. Es ist auch nicht zulässig, einen neuen Typ von einem Delegattyp abzuleiten. Die Delegate Klasse gilt nicht als Delegattyp; es ist eine Klasse, die zum Ableiten von Delegattypen verwendet wird.

Die meisten Sprachen implementieren ein delegate Schlüsselwort, und Compiler für diese Sprachen können von der MulticastDelegate Klasse abgeleitet werden; Daher sollten Die Benutzer das von der Sprache bereitgestellte schlüsselwort delegate verwenden.

Anmerkung

Die Common Language Runtime stellt eine Invoke Methode für jeden Delegattyp mit der gleichen Signatur wie der Delegat bereit. Sie müssen diese Methode nicht explizit aus C#, Visual Basic oder Visual C++ aufrufen, da die Compiler sie automatisch aufrufen. Die Invoke-Methode ist bei Reflexion nützlich, wenn Sie die Signatur des Stellvertretungstyps finden möchten.

Die Common Language Runtime stellt jeden Delegattyp mit BeginInvoke und EndInvoke Methoden bereit, um einen asynchronen Aufruf des Delegaten zu ermöglichen. Weitere Informationen zu diesen Methoden finden Sie unter Aufrufen synchroner Methoden asynchron.

Die Deklaration eines Delegattyps legt einen Vertrag fest, der die Signatur einer oder mehrerer Methoden angibt. Eine Stellvertretung ist eine Instanz eines Delegattyps, auf die Verweise auf:

  • Eine Instanzmethode eines Typs und ein Zielobjekt, das diesem Typ zugewiesen werden kann.

  • Eine Instanzmethode eines Typs, wobei der ausgeblendete this Parameter in der formalen Parameterliste verfügbar gemacht wird. Die Stellvertretung wird als offene Instanzdelegat bezeichnet.

  • Eine statische Methode.

  • Eine statische Methode und ein Zielobjekt, das dem ersten Parameter der Methode zugewiesen werden kann. Die Stellvertretung soll über ihr erstes Argument geschlossen werden.

Weitere Informationen zur Stellvertretungsbindung finden Sie in der CreateDelegate(Type, Object, MethodInfo, Boolean) Methodenüberladung.

Wenn ein Delegat eine Instanzmethode darstellt, die über das erste Argument geschlossen ist (der häufigste Fall), speichert der Delegat einen Verweis auf den Einstiegspunkt der Methode und einen Verweis auf ein Objekt, das als Ziel bezeichnet wird, das dem Typ zugewiesen werden kann, der die Methode definiert hat. Wenn ein Delegat eine offene Instanzmethode darstellt, wird ein Verweis auf den Einstiegspunkt der Methode gespeichert. Die Stellvertretungssignatur muss den ausgeblendeten this Parameter in der formalen Parameterliste enthalten; in diesem Fall verfügt die Stellvertretung nicht über einen Verweis auf ein Zielobjekt, und ein Zielobjekt muss angegeben werden, wenn die Stellvertretung aufgerufen wird.

Wenn ein Delegat eine statische Methode darstellt, speichert der Delegate einen Verweis auf den Einstiegspunkt der Methode. Wenn ein Delegat eine statische Methode darstellt, die über das erste Argument geschlossen wurde, speichert der Delegate einen Verweis auf den Einstiegspunkt der Methode und einen Verweis auf ein Zielobjekt, das dem Typ des ersten Arguments der Methode zugewiesen werden kann. Wenn der Delegat aufgerufen wird, empfängt das erste Argument der statischen Methode das Zielobjekt. Dieses erste Argument muss ein Verweistyp sein.

Die Aufrufliste eines Delegaten ist ein geordneter Satz von Stellvertretungen, in dem jedes Element der Liste genau eine der Methoden aufruft, die durch den Delegaten dargestellt werden. Eine Aufrufliste kann doppelte Methoden enthalten. Während eines Aufrufs werden Methoden in der Reihenfolge aufgerufen, in der sie in der Aufrufliste angezeigt werden. Ein Delegat versucht, jede Methode in der Aufrufliste aufzurufen; Duplikate werden einmal aufgerufen, wenn sie in der Aufrufliste angezeigt werden. Stellvertretungen sind unveränderlich; nach der Erstellung ändert sich die Aufrufliste einer Stellvertretung nicht.

Stellvertretungen werden als Multicast oder kombinierbar bezeichnet, da ein Delegat eine oder mehrere Methoden aufrufen kann und bei kombinationsfähigen Vorgängen verwendet werden kann.

Durch das Kombinieren von Vorgängen wie Combine und Removewerden vorhandene Stellvertretungen nicht geändert. Stattdessen gibt ein solcher Vorgang eine neue Stellvertretung zurück, die die Ergebnisse des Vorgangs, eine unveränderte Stellvertretung oder nullenthält. Ein Kombinationsvorgang gibt null zurück, wenn das Ergebnis des Vorgangs ein Delegat ist, der nicht auf mindestens eine Methode verweist. Ein Kombinationsvorgang gibt einen unveränderten Delegat zurück, wenn der angeforderte Vorgang keine Auswirkung hat.

Anmerkung

Verwaltete Sprachen verwenden die methoden Combine und Remove zum Implementieren von Stellvertretungsvorgängen. Beispiele sind die AddHandler- und RemoveHandler-Anweisungen in Visual Basic und die Operatoren += und -= für Stellvertretungstypen in C#.

Ab .NET Framework 4 können generische Delegattypen Variantentypparameter aufweisen. Contravariant-Typparameter können als Parametertypen des Delegaten verwendet werden, und ein kovarianter Typparameter kann als Rückgabetyp verwendet werden. Mit diesem Feature können generische Delegattypen, die aus derselben generischen Typdefinition erstellt werden, zuordnungskompatibel sein, wenn ihre Typargumente Referenztypen mit einer Vererbungsbeziehung sind, wie in Kovarianz und Contravarianceerläutert.

Anmerkung

Generische Delegats, die aufgrund der Varianz zuweisungskompatibel sind, sind nicht notwendigerweise kombinierbar. Um kombinierbar zu sein, müssen die Typen exakt übereinstimmen. Angenommen, eine Klasse mit dem Namen Derived wird von einer Klasse mit dem Namen Baseabgeleitet. Ein Delegat vom Typ Action<Base> (Action(Of Base) in Visual Basic) kann einer Variablen vom Typ Action<Derived>zugewiesen werden, aber die beiden Stellvertretungen können nicht kombiniert werden, da die Typen nicht exakt übereinstimmen.

Wenn eine aufgerufene Methode eine Ausnahme auslöst, wird die Ausführung der Methode beendet, die Ausnahme wird an den Aufrufer des Delegaten zurückgegeben, und die verbleibenden Methoden in der Aufrufliste werden nicht aufgerufen. Das Abfangen der Ausnahme im Aufrufer ändert dieses Verhalten nicht.

Wenn die Signatur der von einem Delegaten aufgerufenen Methoden einen Rückgabewert enthält, gibt der Delegat den Rückgabewert des letzten Elements in der Aufrufliste zurück. Wenn die Signatur einen Parameter enthält, der per Verweis übergeben wird, ist der endgültige Wert des Parameters das Ergebnis jeder Methode in der Aufrufliste, die sequenziell ausgeführt und der Wert des Parameters aktualisiert wird.

Das nächstgelegene Äquivalent eines Delegaten in C ist ein Funktionszeiger. Ein Delegat kann eine statische Methode oder eine Instanzmethode darstellen. Wenn der Delegat eine Instanzmethode darstellt, speichert der Delegate nicht nur einen Verweis auf den Einstiegspunkt der Methode, sondern auch einen Verweis auf die Klasseninstanz. Im Gegensatz zu Funktionszeigern sind Stellvertretungen objektorientiert und typsicher.

Beispiele finden Sie unter Ergänzende API-Hinweise für System.Delegate.CreateDelegate.

Konstruktoren

Delegate(Object, String)

Initialisiert einen Delegaten, der die angegebene Instanzmethode für die angegebene Klasseninstanz aufruft.

Delegate(Type, String)

Initialisiert einen Delegaten, der die angegebene statische Methode aus der angegebenen Klasse aufruft.

Eigenschaften

HasSingleTarget

Ruft einen Wert ab, der angibt, ob die Delegate über ein einzelnes Aufrufziel verfügt.

Method

Ruft die von der Stellvertretung dargestellte Methode ab.

Target

Ruft die Klasseninstanz ab, für die der aktuelle Delegate die Instanzmethode aufruft.

Methoden

Clone()

Erstellt eine flache Kopie der Stellvertretung.

Combine(Delegate, Delegate)

Verkettet die Aufruflisten von zwei Stellvertretungen.

Combine(Delegate[])

Verkettet die Aufruflisten eines Arrays von Stellvertretungen.

Combine(ReadOnlySpan<Delegate>)

Verkettet die Aufruflisten einer Spanne von Stellvertretungen.

CombineImpl(Delegate)

Verkettet die Aufruflisten des angegebenen Multicastdelegats (kombinierbar) und des aktuellen Multicastdelegats (kombinierbar).

CreateDelegate(Type, MethodInfo)

Erstellt einen Delegaten des angegebenen Typs, um die angegebene Methode darzustellen.

CreateDelegate(Type, MethodInfo, Boolean)

Erstellt einen Delegaten des angegebenen Typs, der die angegebene statische Methode darstellt, wobei das angegebene Verhalten beim Binden nicht auftritt.

CreateDelegate(Type, Object, MethodInfo)

Erstellt einen Delegaten des angegebenen Typs, der die angegebene statische oder Instanzmethode mit dem angegebenen ersten Argument darstellt.

CreateDelegate(Type, Object, MethodInfo, Boolean)

Erstellt einen Delegaten des angegebenen Typs, der die angegebene statische oder Instanzmethode darstellt, mit dem angegebenen ersten Argument und dem angegebenen Verhalten beim Fehler beim Binden.

CreateDelegate(Type, Object, String)

Erstellt einen Delegaten des angegebenen Typs, der die angegebene Instanzmethode darstellt, die für die angegebene Klasseninstanz aufgerufen werden soll.

CreateDelegate(Type, Object, String, Boolean)

Erstellt einen Delegaten des angegebenen Typs, der die angegebene Instanzmethode darstellt, die für die angegebene Klasseninstanz mit der angegebenen Groß-/Kleinschreibung aufgerufen werden soll.

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

Erstellt einen Delegaten des angegebenen Typs, der die angegebene Instanzmethode darstellt, die für die angegebene Klasseninstanz aufgerufen werden soll, wobei die angegebene Groß-/Kleinschreibung und das angegebene Verhalten beim Binden nicht vorhanden sind.

CreateDelegate(Type, Type, String)

Erstellt einen Delegaten des angegebenen Typs, der die angegebene statische Methode der angegebenen Klasse darstellt.

CreateDelegate(Type, Type, String, Boolean)

Erstellt einen Delegaten des angegebenen Typs, der die angegebene statische Methode der angegebenen Klasse mit der angegebenen Groß-/Kleinschreibung darstellt.

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

Erstellt einen Delegat des angegebenen Typs, der die angegebene statische Methode der angegebenen Klasse darstellt, mit der angegebenen Groß-/Kleinschreibung und dem angegebenen Verhalten beim Fehler beim Binden.

DynamicInvoke(Object[])

Ruft die vom aktuellen Delegaten dargestellte Methode dynamisch (spät gebunden) auf.

DynamicInvokeImpl(Object[])

Ruft die vom aktuellen Delegaten dargestellte Methode dynamisch (spät gebunden) auf.

EnumerateInvocationList<TDelegate>(TDelegate)

Ruft einen Enumerator für die Aufrufziele dieses Delegaten ab.

Equals(Object)

Bestimmt, ob das angegebene Objekt und der aktuelle Delegat denselben Typ aufweisen und die gleichen Ziele, Methoden und Aufruflisten gemeinsam verwenden.

GetHashCode()

Gibt einen Hashcode für den Delegaten zurück.

GetInvocationList()

Gibt die Aufrufliste der Stellvertretung zurück.

GetMethodImpl()

Ruft die Methode ab, die durch den aktuellen Delegaten dargestellt wird.

GetObjectData(SerializationInfo, StreamingContext)
Veraltet.

Nicht unterstützt.

GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
Remove(Delegate, Delegate)

Entfernt das letzte Vorkommen der Aufrufliste eines Delegaten aus der Aufrufliste eines anderen Delegaten.

RemoveAll(Delegate, Delegate)

Entfernt alle Vorkommen der Aufrufliste eines Delegaten aus der Aufrufliste eines anderen Delegaten.

RemoveImpl(Delegate)

Entfernt die Aufrufliste eines Delegaten aus der Aufrufliste eines anderen Delegaten.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Operatoren

Equality(Delegate, Delegate)

Bestimmt, ob die angegebenen Stellvertretungen gleich sind.

Inequality(Delegate, Delegate)

Bestimmt, ob die angegebenen Stellvertretungen nicht gleich sind.

Erweiterungsmethoden

GetMethodInfo(Delegate)

Ruft ein Objekt ab, das die vom angegebenen Delegaten dargestellte Methode darstellt.

Gilt für:

Weitere Informationen