События (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#).
Примечание. |
---|
В языке 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#