Delegate Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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
Beispiele
Das folgende Beispiel zeigt, wie sie einen Delegaten mit dem Namen myMethodDelegate
definieren. Instanzen dieses Delegaten werden für eine instance-Methode und eine statische Methode der geschachtelten mySampleClass
Klasse erstellt. Der Delegat für die instance-Methode erfordert eine instance von mySampleClass
. Die mySampleClass
instance wird in einer Variablen mit dem Namen mySC
gespeichert.
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 "".
Hinweise
Die Delegate -Klasse ist die Basisklasse für Delegatentypen. 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 Delegatentyp abzuleiten. Die Delegate Klasse wird nicht als Delegattyp betrachtet. 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 bereitgestellten 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 von C#, Visual Basic oder Visual C++ aufrufen, da die Compiler sie automatisch aufrufen. Die Invoke
Methode ist bei der Reflektion nützlich, 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 Delegatentyps legt einen Vertrag fest, der die Signatur einer oder mehrerer Methoden angibt. Ein Delegat ist ein 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, das dem ersten Parameter der Methode zugewiesen werden kann. Der Delegat soll über sein erstes Argument geschlossen sein.
Weitere Informationen zur Delegatbindung finden Sie unter Methodenüberladung CreateDelegate(Type, Object, MethodInfo, Boolean) .
Wenn ein Delegat eine instance Methode darstellt, die über das erste Argument geschlossen wurde (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, wobei es sich um einen Typ handelt, 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 Delegatensignatur 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 ein geordneter Satz von Delegaten, in dem jedes Element der Liste genau eine der vom Delegaten dargestellten Methoden aufruft. 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 bezeichnet oder kombinierbar, da ein Delegat eine oder mehrere Methoden aufrufen kann und in Kombinationsvorgängen verwendet werden kann.
Durch das Kombinieren von Vorgängen wie Combine und Removewerden 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 enthält null
. 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 , um Delegatvorgänge zu implementieren. Beispiele hierfür sind die AddHandler
Anweisungen und RemoveHandler
in Visual Basic sowie die Operatoren += und -= für Delegatentypen 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. Mit diesem Feature können generische Delegattypen, die aus derselben generischen Typdefinition erstellt werden, zuweisungskompatibel sein, wenn ihre Typargumente Verweistypen mit einer Vererbungsbeziehung sind, wie in Kovarianz und Kontravarianz erläutert.
Hinweis
Generische Delegatten, die aufgrund von Varianz zuweisungskompatibel sind, sind nicht unbedingt kombinierbar. Um kombinierbar zu sein, müssen die Typen genau übereinstimmen. Angenommen, eine Klasse namens Derived
wird von einer Klasse mit dem Namen Base
abgeleitet. 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.
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
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. |
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. |