Что такое событие, и какова их связь с делегатами?

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

Механизм событий можно также описать с помощью модели «публикация — подписка»: один класс, являющийся отправителем (sender) сообщения, публикует события, которые он может инициировать, а другие классы, являющиеся получателями(receivers) сообщения, подписываются на получение этих событий.

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

• описание делегата, задающего сигнатуру обработчиков событий;

• описание события;

• описание метода (методов), инициирующих событие.

Синтаксис события похож на синтаксис делегата:

[ атрибуты ] [ спецификаторы ] event тип имя_события

Длясобытийприменяютсяспецификаторы new, public, protected, internal, private, static, virtual, sealed, override, abstract и extern.

Тип события — это тип делегата, на котором основано событие. Пример описания делегата и соответствующего ему события:

public delegate void Del( object о ); // объявлениеделегата

class A

{

public event Del Oops: // объявлениесобытия

}

Обработка событий выполняется в классах-получателях сообщения. Для этого в них описываются методы-обработчики событий, сигнатура которых соответствуеттипу делегата. Каждый объект (не класс!), желающий получать сообщение,должен зарегистрировать в объекте-отправителе этот метод.

Внутри класса, в котором описано событие, с ним можно обращаться, как с обычным полем, имеющим тип делегата: использовать операции отношения, присваиванияи т, д. Значение события по умолчанию — null.

33. Использование конструкции using (…)

Существует три способа использования murta, определенного в каком-либо Пространстве имен:

1. Использовать полностью квалифицированное имя. Например, в пространстве имен System.Runtime.Serialization.Formatters.Binary описан класс BinaryFormatter.Создание объекта этого' класса с помощью квалифицированного имени выглядиттак:

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf -

new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

2. Использовать директиву using, c помощью которой импортируются все именаиз заданного пространства. В этом случае предыдущий пример примет вид

using System.Runtime.Serialization.Formatters.Binary:

BinaryFormatter bf = new BinaryFormatter();

!!!! Директира using должна располагаться вне,или внутри пространства имен, но до

любых описаний типов.

3. Использовать псевдоним типа. Это делается с помощью второй формы директивыusing:

using BinF fc =

System.Runtime.Serialization.Formatters.Binary.BiriaryFormatter;

BinFbf = newBinF();

Первый способ применяется при однократном использований имени типа файла «неглубоко» вложенных пространств имей, второй - в большинстве остальных случает, а третий можно рекомендовать при многократном использовании длинного имени типа.

В версию языка С# 2.0 введена возможность применять псевдоним пространства имен с помощью операции ::,например:

using SI0 = System.10; // псевдоним пространства имен

using MI0 = MyLibrary.IO; // псевдоним пространства имен

Class Program

{

static void MainO {

SI0::Stream s = new MIO::EmptyStream(); // использованиепсевдонимов

}

}

Есть оператор using1 со следующим синтаксисом:

using ( выделение_ресурса ) оператор

Под ресурсом здесь понимается объект, который реализует интерфейс System.IDisposable, включающий метод Dispose. Код, использующий ресурс, вызовом этогометода сигнализирует о том, что ресурс больше не требуется. Если метод Disposeне был вызван, освобождение ресурса выполняется в процессе сборки мусора.Оператор using неявным образом вызывает метод Dispose в случае успешногосоздания и использования объекта.

using ( Pen pen - new Pen( Color.Red ) )

{

g.DrawLine( pen, 0, 0. 200, 100 );

g.DrawEllipse( pen, new Rectangle(50, 50, 100, 150) );

}

Наши рекомендации