Читаем C# 4.0: полное руководство полностью

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

Применение аксессоров событий

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

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

event делегат_события имя_ события {

  add {

    // Код добавления события в цепочку событий.

  }

  remove {

    // Код удаления события из цепочки событий.

  }

}

В эту форму входят два аксессора событий: add и remove. Аксессор add вызывается, когда обработчик событий добавляется в цепочку событий с помощью оператора +=. В то же время аксессор remove вызывается, когда обработчик событий удаляется из цепочки событий с помощью оператора -=.

Когда вызывается аксессор add или remove, он принимает в качестве параметра добавляемый или удаляемый обработчик. Как и в других разновидностях аксессоров, этот неявный параметр называется value. Реализовав аксессоры add или remove, можно организовать специальную схему хранения обработчиков событий. Например, обработчики событий можно хранить в массиве, стеке или очереди.

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

// Создать специальные средства для управления списками

// вызова обработчиков событий.

using System;

// Объявить тип делегата для события.

delegate void MyEventHandler();

// Объявить класс для хранения максимум трех событий,

class MyEvent {

  MyEventHandler[] evnt = new MyEventHandler[3];

  public event MyEventHandler SomeEvent {

    // Добавить событие в список,

    add {

      int i;

      for(i=0; i < 3; i++)

        if(evnt[i] == null) {

          evnt[i] = value;

          break;

        }

      if (i == 3) Console.WriteLine("Список событий заполнен.");

    }

    // Удалить событие из списка,

    remove {

      int i;

      for(i=0; i < 3; i++)

        if(evnt[i] == value) {

          evnt[i] = null;

          break;

      }

      if (i == 3) Console.WriteLine("Обработчик событий не найден.");

    }

  }

  // Этот метод вызывается для запуска событий,

  public void OnSomeEvent()    {

    for(int i=0; i < 3; i++)

      if(evnt[i] != null) evnt[i]();

  }

}

// Создать ряд классов, использующих делегат MyEventHandler.

class W {

  public void Whandler() {

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

  }

}

class X {

  public void Xhandler() {

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

  }

}

class Y {

  public void Yhandler() {

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

  }

}

class Z {

  public void Zhandler() {

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

  }

}

class EventDemo5 {

  static void Main() {

    MyEvent evt = new MyEvent();

   W wOb = new W(); 

    X xOb = new X(); 

    Y yOb = new Y(); 

    Z zOb = new Z();

    // Добавить обработчики в цепочку событий.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных