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

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

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

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

 

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

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974