logo search
CSharp_Prog_Guide

Пример 2 (контрвариация) Описание

В данном примере демонстрируется использование делегатов с методами, параметры типа которых являются базовыми типами типа параметра сигнатуры делегата. Контрвариация позволяет использовать один обработчик событий в тех случаях, когда приходилось использовать несколько отдельных обработчиков. Например, можно создать обработчик событий, который принимает входной параметр EventArgs и использует его вместе с событием Button.MouseClick, отправляющим в качестве параметра тип MouseEventArgs, а также с событием TextBox.KeyDown, отправляющим параметр KeyEventArgs.

Код

-----

How to: Combine Delegates (Multicast Delegates)

This example demonstrates how to compose multicast delegates. A useful property of delegate objects is that they can be assigned to one delegate instance to be multicast using the + operator. A composed delegate calls the two delegates it was composed from. Only delegates of the same type can be composed.

The - operator can be used to remove a component delegate from a composed delegate.

Example

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");

}

}

Invoking delegate a: Hello, A!

Invoking delegate b: Goodbye, B!

Invoking delegate c: Hello, C!

Goodbye, C!

Invoking delegate d:

Goodbye, D!