Delegate Klasse

Definition

Stellt einen Delegaten dar, der eine Datenstruktur ist, die auf eine statische Methode oder eine Klasseninstanz und eine Instanzmethode dieser Klasse verweist.

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 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, sie ist eine Klasse, die zum Ableiten von Delegattypen verwendet wird.

Die meisten Sprachen implementieren eine delegate Schlüsselwort (keyword), und Compiler für diese Sprachen können von der MulticastDelegate -Klasse abgeleitet werden. Daher sollten Benutzer die von der delegate Sprache bereitgestellte Schlüsselwort (keyword) verwenden.

Hinweis

Die Common Language Runtime stellt eine Invoke Methode für jeden Delegattyp mit derselben 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 nützlich bei der Reflektion , wenn Sie die Signatur des Delegattyps suchen möchten.

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

Die Deklaration eines Delegattyps erstellt einen Vertrag, der die Signatur einer oder mehrerer Methoden angibt. Ein Delegat ist eine instance eines Delegatentyps, der Verweise auf Folgendes aufweist:

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

  • Eine instance Methode eines Typs, wobei der ausgeblendete this Parameter in der liste der formalen Parameter verfügbar gemacht wird. Der Delegat soll ein offener instance Delegat sein.

  • Eine statische Methode.

  • Eine statische Methode und ein Zielobjekt, die dem ersten Parameter der Methode zugewiesen werden können. Der Delegat soll über sein erstes Argument geschlossen sein.

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

Wenn ein Delegat eine instance Methode darstellt, die über sein erstes Argument geschlossen wird (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 einem Typ zugeordnet werden kann, der dem Typ zugewiesen werden kann, der die Methode definiert hat. Wenn ein Delegat eine offene instance-Methode darstellt, speichert er einen Verweis auf den Einstiegspunkt der Methode. Die Delegatsignatur 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 beim Aufrufen des Delegaten muss ein Zielobjekt angegeben werden.

Wenn ein Delegat eine statische Methode darstellt, speichert der Delegat einen Verweis auf den Einstiegspunkt der Methode. Wenn ein Delegat eine statische Methode darstellt, die über das erste Argument geschlossen wird, speichert der Delegat 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 eine geordnete Gruppe von Delegaten, in denen jedes Element der Liste genau eine der Methoden aufruft, die vom 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 seiner Aufrufliste aufzurufen. Duplikate werden einmal aufgerufen, wenn sie in der Aufrufliste angezeigt werden. Delegaten sind unveränderlich; Nach der Erstellung ändert sich die Aufrufliste eines Delegaten nicht.

Delegaten werden als Multicast oder kombinierbar bezeichnet, da ein Delegat eine oder mehrere Methoden aufrufen und in Kombinationsvorgängen verwendet werden kann.

Wenn Sie Vorgänge wie Combine und Removekombinieren, werden vorhandene Delegaten nicht geändert. Stattdessen gibt ein solcher Vorgang einen neuen Delegaten zurück, der die Ergebnisse des Vorgangs, einen unveränderten Delegaten oder nullenthält. Ein kombinierter Vorgang gibt zurück null , wenn das Ergebnis des Vorgangs ein Delegat ist, der nicht auf mindestens eine Methode verweist. Ein kombinierter Vorgang gibt einen unveränderten Delegat zurück, wenn der angeforderte Vorgang keine Auswirkung hat.

Hinweis

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

Ab dem .NET Framework 4 können generische Delegattypen Variantentypparameter aufweisen. Kontravariante Typparameter können als Parametertypen des Delegaten verwendet werden, und ein kovarianter Typparameter kann als Rückgabetyp verwendet werden. Dieses Feature ermöglicht, dass generische Delegattypen, die aus derselben generischen Typdefinition erstellt werden, zuweisungskompatibel sind, wenn ihre Typargumente Verweistypen mit einer Vererbungsbeziehung sind, wie unter Kovarianz und Kontravarianz erläutert.

Hinweis

Generische Delegaten, die aufgrund von Varianz zuweisungskompatibel sind, sind nicht notwendigerweise kombinierbar. Um kombinierbar zu sein, müssen die Typen genau übereinstimmen. Angenommen, eine Klasse namens 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 Delegaten können nicht kombiniert werden, da die Typen nicht genau übereinstimmen.

Wenn eine aufgerufene Methode eine Ausnahme auslöst, wird die -Methode nicht mehr ausgeführt, 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 als Verweis übergeben wird, ist der endgültige Wert des Parameters das Ergebnis jeder Methode in der Aufrufliste, die sequenziell ausgeführt wird und den Wert des Parameters aktualisiert.

Die nächstgelegene Entsprechung eines Delegaten in C ist ein Funktionszeiger. Ein Delegat kann eine statische Methode oder eine instance-Methode darstellen. Wenn der Delegat eine instance Methode darstellt, speichert der Delegat nicht nur einen Verweis auf den Einstiegspunkt der Methode, sondern auch einen Verweis auf die Klasse instance. Im Gegensatz zu Funktionszeigern sind Delegaten 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 Instanzenmethode für die angegebene Klasseninstanz aufruft.

Delegate(Type, String)

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

Eigenschaften

HasSingleTarget

Stellt einen Delegaten dar, der eine Datenstruktur ist, die auf eine statische Methode oder eine Klasseninstanz und eine Instanzmethode dieser Klasse verweist.

Method

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

Target

Ruft die Klasseninstanz ab, für die der aktuelle Delegat die Instanzenmethode aufruft.

Methoden

Clone()

Erstellt eine flache Kopie des Delegaten.

Combine(Delegate, Delegate)

Verkettet die Aufruflisten zweier Delegaten.

Combine(Delegate[])

Verkettet die Aufruflisten eines Arrays von Delegaten.

CombineImpl(Delegate)

Verkettet die Aufruflisten des angegebenen und des aktuellen Multicastdelegaten.

CreateDelegate(Type, MethodInfo)

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

CreateDelegate(Type, MethodInfo, Boolean)

Erstellt einen Delegaten vom angegeben Typ zum Darstellen der angegebenen statischen Methode mit dem angegebenen Verhalten bei Bindungsfehlern.

CreateDelegate(Type, Object, MethodInfo)

Erstellt einen Delegaten vom angegebenen Typ, der die angegebene statische Methode oder Instanzmethode mit dem angegebenen ersten Argument darstellt.

CreateDelegate(Type, Object, MethodInfo, Boolean)

Erstellt einen Delegaten vom angegebenen Typ, der die angegebene statische Methode oder Instanzmethode mit dem angegebenen ersten Argument und dem angegebenen Verhalten bei Bindungsfehlern darstellt.

CreateDelegate(Type, Object, String)

Erstellt einen Delegaten vom angegebenen Typ, der die angegebene Instanzenmethode darstellt, die für die angegebene Klasseninstanz aufgerufen werden soll.

CreateDelegate(Type, Object, String, Boolean)

Erstellt einen Delegaten vom angegebenen Typ, der die angegebene Instanzenmethode darstellt, die für die angegebene Klasseninstanz aufgerufen werden soll, wobei die Groß- und Kleinschreibung den Angaben entsprechend berücksichtigt bzw. nicht berücksichtigt wird.

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

Erstellt einen Delegaten vom angegebenen Typ, der die angegebene Instanzenmethode darstellt, die für die angegebene Klasseninstanz aufgerufen werden soll, wobei die Groß- und Kleinschreibung und das Verhalten bei Bindungsfehlern den Angaben entsprechend berücksichtigt bzw. nicht berücksichtigt wird.

CreateDelegate(Type, Type, String)

Erstellt einen Delegaten vom angegebenen Typ, der die angegebene statische Methode der angegebenen Klasse darstellt.

CreateDelegate(Type, Type, String, Boolean)

Erstellt einen Delegaten vom angegebenen Typ, der die angegebene statische Methode der angegebenen Klasse mit der angegebenen Berücksichtigung von Groß- und Kleinschreibung darstellt.

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

Erstellt einen Delegaten vom angegebenen Typ, der die angegebene statische Methode der angegebenen Klasse darstellt, wobei die Groß- und Kleinschreibung und das Verhalten bei Bindungsfehlern den Angaben entsprechend berücksichtigt bzw. nicht berücksichtigt wird.

DynamicInvoke(Object[])

Ruft die durch den aktuellen Delegaten dargestellte Methode dynamisch (mit später Bindung) auf.

DynamicInvokeImpl(Object[])

Ruft die durch den aktuellen Delegaten dargestellte Methode dynamisch (mit später Bindung) auf.

EnumerateInvocationList<TDelegate>(TDelegate)

Stellt einen Delegaten dar, der eine Datenstruktur ist, die auf eine statische Methode oder eine Klasseninstanz und eine Instanzmethode dieser Klasse verweist.

Equals(Object)

Bestimmt, ob das angegebene Objekt und der aktuelle Delegat vom gleichen Typ sind und die gleichen Ziele, Methoden und Aufruflisten besitzen.

GetHashCode()

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

GetInvocationList()

Gibt die Aufrufliste des Delegaten zurück.

GetMethodImpl()

Ruft die Methode ab, die vom aktuellen Delegaten dargestellt wird.

GetObjectData(SerializationInfo, StreamingContext)
Veraltet.

Wird nicht unterstützt.

GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie des 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 Delegaten gleich sind.

Inequality(Delegate, Delegate)

Bestimmt, ob die angegebenen Delegaten ungleich sind.

Erweiterungsmethoden

GetMethodInfo(Delegate)

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

Gilt für:

Weitere Informationen