Freigeben über


Kombinieren von Delegaten (Multicastdelegaten) (C#-Programmierhandbuch)

In diesem Beispiel wird veranschaulicht, wie Multicast-Delegaten erstellt werden. Eine nützliche Eigenschaft von Delegatobjekten besteht darin, dass Sie mithilfe des + Operators mehrere Methoden einer Stellvertretungsinstanz zuweisen können. Der Multicastdelegat enthält eine Liste der zugewiesenen Delegaten. Wenn Sie den Multicastdelegaten aufrufen, ruft er die Delegaten in der angegebenen Reihenfolge in der Liste auf. Sie können Stellvertretungen desselben Typs nur kombinieren. Sie können den - Operator verwenden, um einen Komponentendelegat aus einem Multicastdelegat zu entfernen.

using System;


namespace DelegateExamples;

// Define a custom delegate that has a string parameter and returns void.
delegate void CustomCallback(string s);

class TestClass
{
    // Define two methods that have the same signature as CustomCallback.
    static void Hello(string s)
    {
        Console.WriteLine($"  Hello, {s}!");
    }

    static void Goodbye(string s)
    {
        Console.WriteLine($"  Goodbye, {s}!");
    }

    static void Main()
    {
        // Declare instances of the custom delegate.
        CustomCallback hiDel, byeDel, multiDel, multiMinusHiDel;

        // In this example, you can omit the custom delegate if you
        // want to and use Action<string> instead.
        //Action<string> hiDel, byeDel, multiDel, multiMinusHiDel;

        // Initialize the delegate object hiDel that references the
        // method Hello.
        hiDel = Hello;

        // Initialize the delegate object byeDel that references the
        // method Goodbye.
        byeDel = Goodbye;

        // The two delegates, hiDel and byeDel, are combined to
        // form multiDel.
        multiDel = hiDel + byeDel;

        // Remove hiDel from the multicast delegate, leaving byeDel,
        // which calls only the method Goodbye.
        multiMinusHiDel = (multiDel - hiDel)!;

        Console.WriteLine("Invoking delegate hiDel:");
        hiDel("A");
        Console.WriteLine("Invoking delegate byeDel:");
        byeDel("B");
        Console.WriteLine("Invoking delegate multiDel:");
        multiDel("C");
        Console.WriteLine("Invoking delegate multiMinusHiDel:");
        multiMinusHiDel("D");
    }
}
/* Output:
Invoking delegate hiDel:
  Hello, A!
Invoking delegate byeDel:
  Goodbye, B!
Invoking delegate multiDel:
  Hello, C!
  Goodbye, C!
Invoking delegate multiMinusHiDel:
  Goodbye, D!
*/

Hinweis

Sie können einem Multicast-Delegat mehrmals denselben Delegat hinzufügen. Wenn Sie den Multicast-Delegaten aufrufen, werden alle Delegaten in der Liste aufgerufen, einschließlich Duplikaten. Wenn Sie einen Delegaten aus einem Multicastdelegat entfernen, wird der rechts außen liegende, übereinstimmende Eintrag entfernt, sodass nur eine Instanz entfernt wird, falls mehrere Kopien vorliegen.

Siehe auch