Выбрать главу

Методы экземпляра в сравнении со статическими методами в качестве обработчиков событий

Методы экземпляра и статические методы могут быть использованы в качестве обработчиков событий, но между ними имеется одно существенное отличие. Когда

статический метод используется в качестве обработчика, уведомление о событии распространяется на весь класс. А когда в качестве обработчика используется метод экземпляра, то события адресуются конкретным экземплярам объектов. Следовательно, каждый объект определенного класса, которому требуется получить уведомление о событии, должен быть зарегистрирован отдельно. На практике большинство обработчиков событий представляет собой методы экземпляра, хотя это, конечно, зависит от конкретного приложения. Рассмотрим применение каждой из этих двух разновидностей методов в качестве обработчиков событий на конкретных примерах.

В приведенной ниже программе создается класс X, в котором метод экземпляра определяется в качестве обработчика событий. Это означает, что каждый объект класса X должен быть зарегистрирован отдельно, чтобы получать уведомления о событиях. Для демонстрации этого факта в данной программе производится групповая адресация события трем отдельным объектам класса X.

/* Уведомления о событиях получают отдельные объекты, когда метод экземпляра используется в качестве обработчика событий. */

using System;

// Объявить тип делегата для события, delegate void MyEventHandler() ;

// Объявить класс, содержащий событие, class MyEvent {

public event MyEventHandler SomeEvent;

// Этот метод вызывается для запуска события, public void OnSomeEvent()    {

if(SomeEvent != null)

SomeEvent() ;

}

}

class X { int id;

public X(int x) { id = x; }

// Этот метод экземпляра предназначен в качестве обработчика событий, public void Xhandler() {

Console.WriteLine("Событие получено объектом " + id);

}

}

class EventDemo3 { static void Main() {

MyEvent evt = new MyEvent();

X ol = new X(1);

X o2 = new X (2);

X o3 = new X(3); evt.SomeEvent += ol.Xhandler; evt.SomeEvent += o2.Xhandler; evt.SomeEvent += o3.Xhandler;

// Запустить событие, evt.OnSomeEvent() ;

}

}

Выполнение кода из этого примера приводит к следующему результату.

Событие получено объектом 1 Событие получено объектом 2 Событие получено объектом 3

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

С другой стороны, когда в качестве обработчика событий используется статический метод, события обрабатываются независимо от какого-либо объекта, как демонстрируется в приведенном ниже примере программы.

/* Уведомления о событии получает класс, когда статический метод используется в качестве обработчика событий. */

using System;

// Объявить тип делегата для события, delegate void MyEventHandler();

// Объявить класс, содержащий событие, class MyEvent {

public event MyEventHandler SomeEvent;

// Этот метод вызывается для запуска события, public void OnSomeEvent()    {

if (SomeEvent != null)

SomeEvent() ;

}

}

class X {

/* Этот статический метод предназначен в качестве обработчика событий. */ public static void Xhandler() {

Console.WriteLine("Событие получено классом.");

}

}

class EventDemo4 { static void Main() {

MyEvent evt = new MyEvent();

evt.SomeEvent += X.Xhandler;

// Запустить событие, evt.OnSomeEvent();

При выполнение кода этого примера получается следующий результат.

Событие получено классом.

Обратите в данном примере внимание на то, что объекты класса X вообще не создаются. Но поскольку Xhandler () является статическим методом класса X, то он может быть привязан к событию SomeEvent и выполнен при вызове метода