Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Подписка на события при помощи анонимного метода

  • Чтобы присоединить анонимный метод к событию, используйте оператор назначения сложения (+=). В следующем примере предположим, что объект с именем publisher имеет событие с именем RaiseCustomEvent, и что класс CustomEventArgs также был определен и содержит некие относящиеся к событию сведения. Обратите внимание, что для класса подписчика требуется ссылка на publisher, чтобы подписаться на его события.

-----

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

Отмена подписки

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

Отмена подписки на событие

  • Чтобы отменить подписку на событие, воспользуйтесь оператором назначения вычитания (-=).

    publisher.RaiseCustomEvent -= HandleCustomEvent;

  • Если подписка на событие отменена для всех подписчиков, экземпляр события в классе издателя получает значение null.

How to: Publish Events that Conform to .NET Framework Guidelines

The following procedure demonstrates how to add events that follow the standard .NET Framework pattern to your own classes and structs. All events in the .NET Framework class library are based on the EventHandler delegate, which is defined as follows:

public delegate void EventHandler(object sender, EventArgs e);

Note:

The .NET Framework 2.0 introduces a generic version of this delegate, EventHandler<(Of <(TEventArgs>)>). The following examples show how to use both versions.

Although events in classes that you define can be based on any valid delegate type, even delegates that return a value, it is generally recommended that you base your events on the .NET Framework pattern by using EventHandler, as shown in the following example.

Публикация событий, соответствующих рекомендациям .Net Framework

В следующей процедуре демонстрируется, как добавлять события, соответствующие стандартному шаблону .NET Framework для пользовательских классов и структур. Все события в библиотеке классов .NET Framework основаны на делегате EventHandler, заданном следующим образом:

public delegate void EventHandler(object sender, EventArgs e);

Примечание.

.NET Framework 2.0 представляет общую версию данного делегата EventHandler<(Of <(TEventArgs>)>). В следующих примерах показано, как использовать обе версии.

Хотя события в задаваемых классах могут быть основаны на действительном типе делегата, даже на делегатах, возвращающих значение, обычно рекомендуется основывать события на шаблоне .NET Framework, используя EventHandler, как показано в следующем примере.

To publish events based on the EventHandler pattern

  1. (Skip this step and go to Step 3a if you do not have to send custom data with your event.) Declare your class at a scope visible to both your publisher and subscriber classes, and add the required members to hold your custom event data. In this example, a simple string is returned.

    public class CustomEventArgs: EventArgs

    {

    public CustomEventArgs(string s)

    {

    msg = s;

    }

    private string msg;

    public string Message

    {

    get { return msg; }

    }

    }

  2. (Skip this step if you are using the generic version of EventHandler<(Of <(TEventArgs>)>) .) Declare a delegate in your publishing class. Give it a name that ends with EventHandler. The second parameter specifies your custom EventArgs type.

    public delegate void CustomEventHandler(object sender, CustomEventArgs a);

  3. Declare the event in your publishing class by using one of the following steps.

    1. If you have no custom EventArgs class, your Event type will be the non-generic EventHandler delegate. You do not have to declare it because it is already declared in the System namespace which is included when you create your C# project:

      public event EventHandler RaiseCustomEvent;

    2. If you are using the non-generic version of EventHandler and you have a custom class derived from EventArgs, declare your event inside your publishing class and use your delegate as the type:

      class Publisher

      {

      public event CustomEventHandler RaiseCustomEvent;

      }

    3. If you are using the generic version, you do not need a custom delegate. Instead, you specify your event type as EventHandler<CustomEventArgs>, substituting the name of your own class between the angle brackets.

public event EventHandler<CustomEventArgs> RaiseCustomEvent;