|
Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Тема: Программирование
Специальности: Программист, Архитектор программного обеспечения
Лекция 10:
Интерфейсы, делегаты, события в C#
Стандартный делегат EventHandler и стандартный аргумент EventArgs
Для большинства практических случаев обработчикам событий достаточно двух параметров, первый из которых будет адресовать объект, возбудивший событие, а второй - некоторую дополнительную информацию. Для этих целей существует библиотечный делегат EventHandler. Он используется во множестве библиотечных классов и вполне может удовлетворить большинство наших потребностей.
Второй аргумент делегата всегда можно расширить, если мы хотим передать с событием свою специфическую информацию. Приведем пример
using System;
namespace Test
{
// Расширение библиотечного класса аргументов
class MyEventArgs : EventArgs
{
private string message; // Поле для хранения сообщения
// Сервис доступа к полю
public String Message
{
get { return message; }
set { message = value; }
}
}
// Класс-источник сообщения
class SourceEvent
{
// Тип стандартного делегата объявлен в mscorlib.System так
// public delegate void EventHandler(object sender,
System.EventArgs e)
// Создание события на базе стандартного делегата
public event EventHandler Event;
// Метод диспетчеризации события
protected virtual void OnEvent(EventArgs args)
{
if (Event != null)
Event(this, args); // Вызываем обработчики
}
// Симулятор срабатывания события Event по внешней причине
public void SimulateEvent()
{
// Создаем толстый объект и формируем передаваемую информацию
MyEventArgs args = new MyEventArgs();
args.Message = "'Это сообщение
поступило с событием'";
// Вызываем функцию диспетчеризации события.
// Функция ожидает тонкий объект, а ей
// передается толстый объект - это нормально
OnEvent(args);
}
}
// Получатель сообщения
class MyClass
{
// Конструктор
public MyClass()
{
// Создаем объект, имеющий событие
SourceEvent obj = new SourceEvent();
// Подписываемся на обработчики события
obj.Event += new EventHandler(Handler1);
obj.Event += new EventHandler(Handler2);
// Вызываем симулятор возникновения события
obj.SimulateEvent();
}
void Handler1(object sender, EventArgs e)
{
// Хотим извлечь информацию из толстого объекта,
// значит нужно повысить полномочия тонкой ссылки
MyEventArgs args = (MyEventArgs)e;
String message = args.Message;
Console.WriteLine("(Handler1) Получена
информация:\n" + message);
Console.WriteLine();
}
void Handler2(object sender, EventArgs e)
{
Console.WriteLine("(Handler2) Событие из о
бъекта {0}\n" +
"Передан объект-аргумент {1}",
sender.GetType().Name,
e.GetType().Name);
}
}
// Запуск
class Program
{
static void Main()
{
// Настройка консоли
Console.Title = "Применение делегата EventHandler";
Console.ForegroundColor = ConsoleColor.White;
Console.CursorVisible = false;
Console.WindowWidth = 43;
Console.WindowHeight = 6;
new MyClass();// Исполняем
Console.ReadLine();
}
}
}
Листинг
10.22 .
Применение стандартного делегата EventHandler
