Герберт Шилдт - 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: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Для управления списком обработчиков событий служит расширенная форма оператора
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();
// Добавить обработчики в цепочку событий.
Console.WriteLine("Добавление событий.");
evt.SomeEvent += wOb.Whandler;
evt.SomeEvent += xOb.Xhandler;
evt.SomeEvent += yOb.Yhandler;
// Сохранить нельзя - список заполнен,
evt.SomeEvent += zOb.Zhandler;
Console.WriteLine();
// Запустить события,
evt.OnSomeEvent();
Console.WriteLine();
// Удалить обработчик.
Console.WriteLine("Удаление обработчика xOb.Xhandler.");
evt.SomeEvent -= xOb.Xhandler;
evt.OnSomeEvent();
Console.WriteLine();
// Попробовать удалить обработчик еще раз.
Console.WriteLine("Попытка удалить обработчик " +
"xOb.Xhandler еще раз.");
evt.SomeEvent -= xOb.Xhandler;
evt.OnSomeEvent();
Console.WriteLine();
//А теперь добавить обработчик Zhandler.
Console.WriteLine("Добавление обработчика zOb.Zhandler.");
evt.SomeEvent += zOb.Zhandler;
evt.OnSomeEvent();
}
}
Ниже приведен результат выполнения этой программы
Добавление событий.
Список событий заполнен.
Событие получено объектом W
Событие получено объектом X
Событие получено объектом Y
Удаление обработчика xOb.Xhandler.
Событие получено объектом W
Событие получено объектом Y
Попытка удалить обработчик xOb.Xhandler еще раз.
Обработчик событий не найден.
Событие получено объектом W
Событие получено объектом Y
Добавление обработчика zOb.Zhandler.
Событие получено объектом W
Событие получено объектом X
Событие получено объектом Y
Рассмотрим данную программу более подробно. Сначала в ней определяется делегат обработчиков событий
MyEventHandler
. Затем объявляется класс MyEvent
. В самом его начале определяется массив обработчиков событий evnt
, состоящий из трех элементов.
MyEventHandler[] evnt = new MyEventHandler[3];
Этот массив служит для хранения обработчиков событий, добавляемых в цепочку событий. По умолчанию элементы массива
evnt
инициализируются пустым значением ( null
).
Интервал:
Закладка: