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

Beispiele

Das folgende Beispiel zeigt, wie ein Delegat mit dem Namen definiert myMethodDelegate wird. Instanzen dieses Delegaten werden für eine Instanzmethode und eine statische Methode der geschachtelten Klasse mySampleClass erstellt. Der Delegat für die Instanzmethode erfordert eine Instanz von mySampleClass . Die mySampleClass Instanz wird in einer Variablen namens 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 "".
*/
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 Delegattypen. Allerdings können nur das System und die Compiler explizit von der -Klasse oder Delegate der -Klasse MulticastDelegate ableiten. Es ist auch nicht zulässig, einen neuen Typ von einem Delegattyp ableiten. Die -Klasse wird nicht als Delegattyp betrachtet. Sie ist eine Klasse, die zum Ableiten Delegate von Delegattypen verwendet wird.

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

Hinweis

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

Die Common Language Runtime stellt jeden Delegattyp mit den Methoden BeginInvoke und zur Aktivierung des EndInvoke asynchronen Aufrufs des Delegaten zur Unterstützung. Weitere Informationen zu diesen Methoden finden Sie unter Asynchrones Aufrufen von synchronen Methoden.

Die Deklaration eines Delegattyps legt einen Vertrag fest, der die Signatur einer oder mehrere Methoden angibt. Ein Delegat ist eine Instanz eines Delegattyps mit Verweisen auf:

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

  • Eine Instanzmethode eines Typs, bei der der ausgeblendete this Parameter in der formalen Parameterliste verfügbar gemacht wird. Der Delegat wird als offener Instanz-Delegat bezeichnet.

  • Eine statische Methode.

  • Eine statische Methode und ein Zielobjekt, das dem ersten Parameter der Methode zugewiesen werden kann. Der Delegat wird als über sein erstes Argument geschlossen.

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

Hinweis

In den .NET Framework Versionen 1.0 und 1.1 kann ein Delegat nur dann eine Methode darstellen, wenn die Signatur der Methode genau mit der vom Delegattyp angegebenen Signatur entspricht. Daher werden nur die ersten und dritten Aufzählungszeichen in der vorherigen Liste unterstützt, und das erste Aufzählungszeichen erfordert eine genaue Typ übereinstimmung.

Wenn ein Delegat eine Instanzmethode darstellt, die über sein erstes 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, das einem Typ zugeordnet werden kann, der 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 Delegatsignatur muss den ausgeblendeten 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 this wird.

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 wurde, 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 durch den 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 der Aufrufliste auf aufruft. Duplikate werden einmal für jedes Mal aufgerufen, wenn sie in der Aufrufliste angezeigt werden. Delegaten sind unveränderlich. Nach dem Erstellen ändert sich die Aufrufliste eines Delegaten nicht mehr.

Delegaten werden als Multicast oder kombinierbar bezeichnet, da ein Delegat eine oder mehrere Methoden aufrufen und zum Kombinieren von Vorgängen verwendet werden kann.

Durch das Kombinieren von Vorgängen wie Combine und Remove 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 null enthält. Ein kombinierende Vorgang gibt null zurück, wenn das Ergebnis des Vorgangs ein Delegat ist, der nicht auf mindestens eine Methode verweist. Ein kombinierende Vorgang gibt einen unveränderten Delegaten zurück, wenn der angeforderte Vorgang keine Auswirkungen hat.

Hinweis

Verwaltete Sprachen verwenden die Methoden Combine und Remove , um Delegatvorgänge zu implementieren. Beispiele hierfür sind AddHandler die RemoveHandler Anweisungen Visual Basic und die Operatoren += und -= für Delegattypen in C#.

Ab der .NET Framework 4 können generische Delegattypen varianten Typparameter haben. 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 unter Kovarianz und Kontravarianz erläutert.

Hinweis

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

Wenn eine aufgerufene Methode eine Ausnahme auslöst, beendet die Methode die Ausführung, die Ausnahme wird an den Aufrufer des Delegaten übergeben, 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.

Das nächste Ä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 Delegat nicht nur einen Verweis auf den Einstiegspunkt der Methode, sondern auch einen Verweis auf die Klasseninstanz. Im Gegensatz zu Funktionsze zeigern 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 vom angegebenen Typ, der die angegebene statische Methode darstellen soll.

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 statische Methode ab, die durch den aktuellen Delegaten dargestellt wird.

GetObjectData(SerializationInfo, StreamingContext)

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:

Siehe auch