Герберт Шилдт - C# 4.0: полное руководство
- Название:C# 4.0: полное руководство
- Автор:
- Жанр:
- Издательство:ООО И.Д. Вильямс
- Год:2011
- Город:Москва -- Киев
- ISBN:978-5-8459-1684-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0: полное руководство краткое содержание
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.
Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию
C# 4.0: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Далее объявляется событие
SomeEvent. В этом объявлении используется приведенная ниже аксессорная форма оператора event.
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;
}
}
}
Когда в цепочку событий добавляется обработчик событий, вызывается аксессор
add, и в первом неиспользуемом (т.е. пустом) элементе массива evntзапоминается ссылка на этот обработчик, содержащаяся в неявно задаваемом параметре value. Если в массиве отсутствуют свободные элементы, то выдается сообщение об ошибке. (Разумеется, в реальном коде при переполнении списка лучше сгенерировать соответствующее исключение.) Массив evntсостоит всего из трех элементов, поэтому в нем можно сохранить только три обработчика событий. Когда же обработчик событий удаляется из цепочки событий, то вызывается аксессор removeи в массиве evntосуществляется поиск ссылки на этот обработчик, передаваемой в качестве параметра value. Если ссылка найдена, то соответствующему элементу массива присваивается пустое значение ( null), а значит, обработчик удаляется из цепочки событий.
При запуске события вызывается метод
OnSomeEvent(). В этом методе происходит циклическое обращение к элементам массива evntдля вызова по очереди каждого обработчика событий.
Как демонстрирует рассматриваемый здесь пример программы, механизм хранения обработчиков событий нетрудно реализовать, если в этом есть потребность. Но для большинства приложений более подходящим оказывается используемый по умолчанию механизм хранения обработчиков событий, который обеспечивает форма оператора
eventбез аксессоров. Тем не менее аксессорная форма оператора eventиспользуется в особых случаях. Так, если обработчики событий необходимо выполнять в программе в порядке их приоритетности, а не в том порядке, в каком они вводятся в цепочку событий, то для их хранения можно воспользоваться очередью по приоритету.
------------------------------------
ПРИМЕЧАНИЕ
В многопоточных приложениях обычно приходится синхронизировать доступ к аксессо-рам событий. Подробнее о многопоточном программировании речь пойдет в главе 23.
------------------------------------
Разнообразные возможности событий
События могут быть определены и в интерфейсах. При этом события должны предоставляться классами, реализующими интерфейсы. События могут быть также определены как абстрактные (
abstract). В этом случае конкретное событие должно быть реализовано в производном классе. Но аксессорные формы событий не могут быть абстрактными. Кроме того, событие может быть определено как герметичное ( sealed). И наконец, событие может быть виртуальным, т.е. его можно переопределить в производном классе.
Применение анонимных методов и лямбда-выражений вместе с событиями
Анонимные методы и лямбда-выражения особенно удобны для работы с событиями, поскольку обработчик событий зачастую вызывается только в коде, реализующем механизм обработки событий. Это означает, что создавать автономный метод, как правило, нет никаких причин. А с помощью лямбда-выражений или анонимных методов можно существенно упростить код обработки событий.
Как упоминалось выше, лямбда-выражениям теперь отдается большее предпочтение по сравнению с анонимными методами, поэтому начнем именно с них. Ниже приведен пример программы, в которой лямбда-выражение используется в качестве обработчика событий.
// Использовать лямбда-выражение в качестве обработчика событий,
using System;
// Объявить тип делегата для события,
delegate void MyEventHandler(int n);
// Объявить класс, содержащий событие,
class MyEvent {
public event MyEventHandler SomeEvent;
// Этот метод вызывается для запуска события,
public void OnSomeEvent(int n) {
if(SomeEvent != null)
SomeEvent(n);
}
}
class LambdaEventDemo {
static void Main() {
MyEvent evt = new MyEvent();
// Использовать лямбда-выражение в качестве обработчика событий,
evt.SomeEvent += (n) =>
Console.WriteLine("Событие получено. Значение равно " + n);
// Запустить событие,
evt.OnSomeEvent(1);
evt.OnSomeEvent(2);
}
}
Вот к какому результату приводит выполнение этой программы.
Событие получено. Значение равно 1
Событие получено. Значение равно 2
Обратите особое внимание на то, как в этой программе лямбда-выражение используется в качестве обработчика событий.
evt.SomeEvent += (n) =>
Console.WriteLine("Событие получено. Значение равно " + n);
Синтаксис для использования лямбда-выражения в качестве обработчика событий остается таким же, как для его применения вместе с любым другим типом делегата.
Несмотря на то что при создании анонимной функции предпочтение следует теперь отдавать лямбда-выражениям, в качестве обработчика событий можно по-прежнему использовать анонимный метод. Ниже приведен вариант обработчика событий из предыдущего примера, измененный с целью продемонстрировать применение анонимного метода.
// Использовать анонимный метод в качестве обработчика событий,
evt.SomeEvent += delegate(int n) {
Console.WriteLine("Событие получено. Значение равно " + n);
};
Как видите, синтаксис использования анонимного метода в качестве обработчика событий остается таким же, как и для его применения вместе с любым другим типом делегата.
Рекомендации по обработке событий в среде .NET Framework
Интервал:
Закладка: