Опубликован: 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

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?