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
[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
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
[<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
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 wird nicht als Delegattyp betrachtet. Es handelt sich um 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 Benutzer das delegate von der Sprache bereitgestellte Schlüsselwort verwenden.

Note

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 von C# oder Visual Basic aufrufen, da die Compiler sie automatisch aufrufen. Die Invoke Methode ist hilfreich bei der Reflexion , wenn Sie die Signatur des Delegattyps 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 Asynchrones Aufrufen synchroner Methoden.

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 der Delegat nicht über einen Verweis auf ein Zielobjekt, und ein Zielobjekt muss angegeben werden, wenn der Delegat 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.

Das Kombinieren von Vorgängen, z Combine . B. und Remove,, ändert keine vorhandenen Stellvertretungen. Stattdessen gibt ein solcher Vorgang einen neuen Delegat zurück, der die Ergebnisse des Vorgangs, einen unveränderten Delegaten oder nulleinen . Ein Kombinationsvorgang gibt zurück null , 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.

Note

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

Generische Delegattypen können 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, zuweisungskompatibel sein, wenn ihre Typargumente Referenztypen mit einer Vererbungsbeziehung sind, wie in "Kovarianz" und "Contravariance" erläutert.

Note

Generische Delegats, die aufgrund der Varianz zuweisungskompatibel sind, sind nicht notwendigerweise kombinierbar. Um kombinierbar zu sein, müssen die Typen exakt übereinstimmen. Angenommen, eine benannte Derived Klasse 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, die beiden Stellvertretungen können jedoch 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 in den ergänzenden API-Hinweisen für System.Delegate.CreateDelegate.

Konstruktoren

Name Beschreibung
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

Name Beschreibung
Method

Ruft die von der Stellvertretung dargestellte Methode ab.

Target

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

Methoden

Name Beschreibung
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.

CombineImpl(Delegate)

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

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, MethodInfo)

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

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, MethodInfo)

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

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, 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)

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

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.

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)

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

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.

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)

Wird 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

Name Beschreibung
Equality(Delegate, Delegate)

Bestimmt, ob die angegebenen Stellvertretungen gleich sind.

Inequality(Delegate, Delegate)

Bestimmt, ob die angegebenen Stellvertretungen nicht gleich sind.

Erweiterungsmethoden

Name Beschreibung
GetMethodInfo(Delegate)

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

Gilt für:

Weitere Informationen