So arbeiten Sie mit Delegierten in C #

Ein Delegat ist ein typsicherer Funktionszeiger, der auf eine Methode verweisen kann, die dieselbe Signatur wie die des Delegaten hat. Sie können Delegaten in C # nutzen, um Ereignisse und Rückrufmethoden zu implementieren. Ein Multicast-Delegat kann auf eine oder mehrere Methoden mit identischen Signaturen verweisen.

Grundlegendes zu Delegaten in C #

Im Wesentlichen enthält ein Delegat einen Verweis auf eine Methode und auch auf das Zielobjekt, für das die Methode aufgerufen werden soll. Delegaten in C # ähneln Funktionszeigern in C ++, C # -Delegierte sind jedoch typsicher. Sie können Methoden als Parameter an einen Delegaten übergeben, damit der Delegat auf die Methode verweisen kann. Delegaten werden verwendet, um Rückrufmethoden zu definieren und die Ereignisbehandlung zu implementieren. Sie werden mit dem Schlüsselwort "delegate" deklariert. Sie können einen Delegaten deklarieren, der einzeln oder sogar in einer Klasse verschachtelt angezeigt werden kann.

Die Verwendung von Delegaten erfolgt in drei Schritten. Dazu gehören Deklaration, Instanziierung und Aufruf. 

Die Unterschrift eines Delegierten sieht folgendermaßen aus:

Bezeichner des Ergebnistyps ([Parameter])

Die folgende Anweisung zeigt, wie Sie einen Delegaten deklarieren können.

öffentlicher Delegat void MyDelegate (Zeichenfolgentext);

Wie Sie in der obigen Anweisung sehen können, lautet der Delegatenname "MyDelegate", hat den Rückgabetyp "void" und akzeptiert ein Zeichenfolgenobjekt als Argument. Dies bedeutet, dass der Delegat MyDelegate auf eine Methode mit identischer Signatur verweisen kann. Dies ist jedoch nur eine Erklärung - Sie müssen einen Delegaten instanziieren, bevor Sie ihn verwenden können. Die folgende Anweisung zeigt, wie Sie den oben deklarierten Delegaten instanziieren können.

MyDelegate d = neues MyDelegate (ShowText);

Nachdem Sie den Delegaten deklariert und instanziiert haben, können Sie die Methode aufrufen, auf die der Delegat verweist.

d ("Hallo Welt ...");

Hier ist d die Delegateninstanz

Sie können auch die Methode aufrufen, auf die die Delegateninstanz verweist, indem Sie die Invoke () -Methode für die Delegateninstanz verwenden (siehe unten).

d.Invoke ("Hallo Welt ...");

Wenn Sie eine Methode haben, die zwei Zahlen akzeptiert und diese hinzufügen und die Summe der beiden Zahlen zurückgeben möchten, können Sie den Rückgabewert der Methode mithilfe eines Delegaten speichern, wie im folgenden Codeausschnitt gezeigt.

int result = d (12, 15);

Hier ist die vollständige Codeliste als Referenz.

using System;

Namespace Delegates

{

    öffentlicher Delegat int MyDelegate (int x, int y);

    Klassenprogramm

    {

      statische int Summe (int x, int y)

        {

            return x + y;

        }}

        statische Leere Main ()

        {

            MyDelegate d = neues MyDelegate (Summe);           

            int result = d.Invoke (12, 15);

            Console.WriteLine (Ergebnis);

            Console.ReadLine ();

        }}

    }}

}} 

Delegierte in Aktion in C #

Hier ist die vollständige Codeliste.

using System;

Namespace Delegates

{

    öffentlicher Delegat void MyDelegate (Zeichenfolgentext);

    Klassenprogramm

    {

        public static void ShowText (Zeichenfolgentext)

        {

            Console.WriteLine (Text);

        }}

        statische Leere Main ()

        {

            MyDelegate d = neues MyDelegate (ShowText);

            d ("Hallo Welt ...");

            Console.ReadLine ();

        }}

    }}

}}

Beachten Sie, dass Sie einer Delegateninstanz mit dem Operator + mehrere Objekte zuweisen können, wodurch der Delegat zu einem Multicasting-Delegaten wird. Sie können delegierte Instanzen auch mit der statischen Methode Kombinieren kombinieren.

Die Laufzeit verwaltet intern eine Liste (auch Aufrufliste genannt), um mehrere Methoden auszuführen. Die folgende Codeliste zeigt, wie Sie mit der Combine () -Methode mehrere Delegateninstanzen kombinieren können.

myDelegate d1 = new myDelegate (Methode1);

myDelegate d2 = new myDelegate (Methode2);

myDelegate multicastDelegate = (myDelegate) Delegate.Combine (d1, d2);

multicastDelegate.Invoke ();

Ein Delegat, der auf mehrere Methoden verweisen kann, wird als Multicast-Delegat bezeichnet. Beachten Sie, dass Delegateninstanzen unveränderlich sind. Wenn Sie also Delegaten kombinieren oder eine Delegateninstanz von der Liste subtrahieren, wird eine neue Delegateninstanz erstellt, die die aktualisierte oder neue Liste der aufzurufenden Ziele oder Methoden darstellt.

Multicast-Delegierte in Aktion in C #

Die folgende Codeliste zeigt einen Multicast-Delegaten. Beachten Sie die Verwendung der Delegateninstanz: Hier haben wir den Operator + = verwendet, um den Delegaten mehreren Methoden mit identischen Signaturen zuzuweisen.

using System;

Namespace Delegates

{

    öffentlicher Delegierter void MyDelegate ();

    Klassenprogramm

    {

        public static void Method1 ()

        {

            Console.WriteLine ("Inside Method1 ...");

        }}

        public static void Method2 ()

        {

            Console.WriteLine ("Inside Method2 ...");

        }}

        statische Leere Main ()

        {

            MyDelegate d = null;

            d + = Methode1;

            d + = Methode2;

            d.Invoke ();

            Console.ReadLine ();

        }}

    }}

}}

Die Teilnehmer sind ideal für die Implementierung einer ereignisgesteuerten Programmierung geeignet. Ein Delegat muss die Klasse des Objekts, auf das er sich bezieht, nicht kennen. Alles, was es wissen muss, ist die Signatur der Methode, auf die es verweisen würde. Die ordnungsgemäße Verwendung von Delegaten kann die Wiederverwendbarkeit Ihres Codes und die Flexibilität Ihrer Entwürfe fördern. Weitere Informationen zu Delegaten finden Sie in der Online-Dokumentation von Microsoft.