События (C# и Java)

Обновлен: Ноябрь 2007

Посредством события класс уведомляет пользователей объекта о происходящих действиях с этим объектам, например, о щелчке элемента управления в графическом интерфейсе пользователя. Такое уведомление называется инициированием события. Объект, вызывающий событие, называют источником или отправителем события.

В отличие от обработки событий в языке Java, которая выполняется путем реализации настраиваемых классов прослушивателя, разработчики C# для обработки событий могут использовать делегаты. Делегат — это тип, который инкапсулирует метод. Когда делегат вызывается методом, он ведет себя в точности, как этот метод, и может быть вызван оператором (). Он похож на указатель функции C++, но является строго типизированным.

Делегат можно использовать с параметрами и возвращаемым значением как и любой другой метод, как показано в примере:

public delegate int ReturnResult(int x, int y);

Дополнительные сведения о делегатах см. в разделе Делегаты (руководство по программированию на C#).

События, такие как методы, имеют подпись, которая содержит имя и список параметров. Эта подпись определяется типом делегата, например:

public delegate void MyEventHandler(object sender, System.EventArgs e);

В программировании пользовательского интерфейса Windows обычно в качестве первого параметра используется объект, ссылающийся на источник события, а для второго параметра — объект с данными, относящимися к событию. Однако такая структура не рекомендуется или не требуется языком C#; подпись события может быть любой допустимой подписью делегата, пока она возвращает пустое значение.

Событие можно объявить при помощи ключевого слова event, как в следующем примере:

public event MyEventHandler TriggerIt;

Чтобы инициировать событие, определите метод, вызываемый при инициировании события, как в следующем примере:

public void Trigger()
{
    TriggerIt();
}

Чтобы инициировать событие, вызовите делегат и передайте параметры, связанные с событием. Затем делегат вызовет всех обработчиков, добавленных к событию. Каждому событию может быть назначено несколько обработчиков для получения события. В этом случае, событие вызывает каждого получателя автоматически. Для инициирования события требуется только один вызов события независимо от числа получателей.

Чтобы класс получил событие, подпишитесь на это событие, добавив делегат к событию при помощи оператора +=, например:

myEvent.TriggerIt += myEvent.MyMethod;

Чтобы отписаться от события, удалите делегат из события при помощи оператора -=, например:

myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod);

Дополнительные сведения о событиях см. в разделе События (Руководство по программированию в C#).

ms228499.alert_note(ru-ru,VS.90).gifПримечание.

В языке C# 2.0 делегаты могут инкапсулировать как именованные методы, так и анонимные методы. Дополнительные сведения об анонимных методах см. в разделе Анонимные методы (Руководство по программированию в C#).

Пример

Описание

В следующем примере определяется событие с тремя методами, которые связаны с ним. При инициировании события методы выполняются. Затем, один метод удаляется из события и событие инициируется еще раз.

Код

// Declare the delegate handler for the event:
public delegate void MyEventHandler();

class TestEvent
{
    // Declare the event implemented by MyEventHandler.
    public event MyEventHandler TriggerIt;

    // Declare a method that triggers the event:
    public void Trigger()
    {
        TriggerIt();
    }
    // Declare the methods that will be associated with the TriggerIt event.
    public void MyMethod1()
    {
        System.Console.WriteLine("Hello!");
    }
    public void MyMethod2()
    {
        System.Console.WriteLine("Hello again!");
    }
    public void MyMethod3()
    {
        System.Console.WriteLine("Good-bye!");
    }

    static void Main()
    {
        // Create an instance of the TestEvent class.
        TestEvent myEvent = new TestEvent();

        // Subscribe to the event by associating the handlers with the events:
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod1);
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod2);
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod3);
        // Trigger the event:
        myEvent.Trigger();

        // Unsuscribe from the the event by removing the handler from the event:
        myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod2);
        System.Console.WriteLine("\"Hello again!\" unsubscribed from the event."); 

        // Trigger the new event:
        myEvent.Trigger();
    }
}

Выходные данные

Hello!
Hello again!
Good-bye!
"Hello again!" unsubscribed from the event.
Hello!
Good-bye!

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

event (Справочник по C#)

delegate (справочник по C#)

Другие ресурсы

Язык C# для разработчиков на языке Java