Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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