Простой Делегат (делегат) по сравнению с Многоадресными делегатами

Я прошел много статей, но я все еще не соглашаюсь с различием между нормальными делегатами, которых мы обычно создаем и многоадресные делегаты.

public delegate void MyMethodHandler(object sender);
MyMethodHandler handler = new MyMethodHandler(Method1);
handler += Method2;
handler(someObject);

Вышеупомянутый делегат MyMethodHandler назовет эти два метода. Теперь, где многоадресные делегаты входят. Я считал, что они могут назвать несколько методов, но я боюсь, что мое основное понимание о делегатах не корректно.

63
задан Charles 23 November 2013 в 04:33
поделиться

2 ответа

Эта статья объясняет это довольно хорошо:

delegate void Del(string s);

class TestClass
{
    static void Hello(string s)
    {
        System.Console.WriteLine("  Hello, {0}!", s);
    }

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

    static void Main()
    {
        Del a, b, c, d;

        // Create the delegate object a that references 
        // the method Hello:
        a = Hello;

        // Create the delegate object b that references 
        // the method Goodbye:
        b = Goodbye;

        // The two delegates, a and b, are composed to form c: 
        c = a + b;

        // Remove a from the composed delegate, leaving d, 
        // which calls only the method Goodbye:
        d = c - a;

        System.Console.WriteLine("Invoking delegate a:");
        a("A");
        System.Console.WriteLine("Invoking delegate b:");
        b("B");
        System.Console.WriteLine("Invoking delegate c:");
        c("C");
        System.Console.WriteLine("Invoking delegate d:");
        d("D");
    }
}
/* Output:
Invoking delegate a:
  Hello, A!
Invoking delegate b:
  Goodbye, B!
Invoking delegate c:
  Hello, C!
  Goodbye, C!
Invoking delegate d:
  Goodbye, D!
*/
74
ответ дан 24 November 2019 в 16:15
поделиться

В спецификации C # указано, что все типы делегатов должны быть преобразованы в System.Delegate . Фактически, реализация реализует это так, что все типы делегатов являются производными от System.MulticastDelegate , который, в свою очередь, является производным от System.Delegate .

Это ясно? Я не уверен, что ответил на ваш вопрос.

48
ответ дан 24 November 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: