Главная страница Библиотека (скачать книги) Скачать софт Введение в программирование Стандарты для C++ Уроки по C# Уроки по Python HTML Веб-дизайн Ассемблер в среде Windows ActiveX Javascript Общее о Линукс Линукс - подробно Линукс - новое Delphi Паскаль для начинающих Турбопаскаль Новости Партнеры Наши предложения Архив новостей |
События.Понятие события вам уже известно из курса программирования под Windows. В контексте C# событие - это способ, с помощью которого один класс оповещает другой (другие) класс о чем-то произошедшем. Иногда говоря, что механизм событий использует идеологию “публикация/подписка”. Какой-то класс публикует свои события, а другие классы подписываются на те события, которые им интересны. Кроме этой модели события, безусловно, используются при программировании на C# с использованием Windows Forms. Для работы с событием нужно выполнить следующие действия:1) Создать делегат, который будет использоваться для вызова нужного метода при срабатывании события 2) Определить само событие при помощи ключевого слова event. Слова словами давайте рассмотрим пример на события: using System; using System.Collections; class Human{ // Делегат для реакции на событие public delegate void HumanHandler(string info); // События, которые могут возникать public static event HumanHandler Run; public static event HumanHandler Stop; // Методы из которых могут генерироваться события public void MayBeStart(){ Random rand = new Random(); if(rand.Next(0,2)==0) Run("Беги, Лола, Беги");// Генерируем событие и передаём ему параметры!!! } public void MayBeStop(){ Random rand = new Random(); if(rand.Next(0,2)==0) Stop("Стоп,Машина");// Генерируем событие и передаём ему параметры!!! } public enum Sex{Male,Female}; private Sex p; private string name; private string surname; private int age; public Human(){ name = surname = "Нет Данных"; age = 0; p = Sex.Male; } public Human(string name,string surname,int age,Sex p){ this.name = name; this.surname = surname; this.age = age; this.p = p; } public string Name{ get{ return name; } set{ name = value; } } public string Surname{ get{ return name; } set{ name = value; } } public int Age{ get{ return age; } set{ age = value; } } public Sex RealSex{ get{ return p; } set{ p = value; } } } // Класс с Main, и обработчиками class Sample{ // Обработчики событий // Обработчик Run public static void OnRun(string msg){ Console.WriteLine("В OnRun:"+msg); } // Обработчик Stop public static void OnStop(string msg){ Console.WriteLine("В OnStop:"+msg); } // Обработчик Run public static void OnRun2(string msg){ Console.WriteLine("В OnRun2:"+msg); } public static void Main(){ Human obj = new Human(); // Добавление к событиям обработчиков используя делегаты Human.Run += new Human.HumanHandler(OnRun); Human.Stop += new Human.HumanHandler(OnStop); Console.WriteLine("\n*****************************************\n"); for(int i = 0;i<5;i++) obj.MayBeStart(); Console.WriteLine("\n*****************************************\n"); for(int i = 0;i<5;i++) obj.MayBeStop(); // Добавляем ещё один обработчик для Run Human.Run += new Human.HumanHandler(OnRun2); Console.WriteLine("\n*****************************************\n"); for(int i = 0;i<5;i++) obj.MayBeStart(); // Удаляем обработчик события Run под названием OnRun2 Human.Run -= new Human.HumanHandler(OnRun2); Console.Read(); } } Обратите внимание, как переплетаются между собой события и делегаты в нашем примере. Например, мы указываем какие методы будут, в ответ, на приход события вызываться при помощи делегата (то есть, указываем названия обработчиков). В терминологии С# указание обработчика для события – это подключение приёмника для прослушивания события. Вот так гордо называются строки приведенные ниже: // Добавление к событиям обработчиков используя делегаты Human.Run += new Human.HumanHandler(OnRun); Human.Stop += new Human.HumanHandler(OnStop); Отсоединение обработчика называется отключением от прослушивания. Например, этот процесс указывается ниже ещё раз: // Удаляем обработчик события Run под названием OnRun2 Human.Run -= new Human.HumanHandler(OnRun2); Обработчики событий можно также поместить в отдельный класс. Например: using System; using System.Collections; class Human{ // Делегат public delegate void HumanHandler(string info); // События public static event HumanHandler Run; public static event HumanHandler Stop; // Генерация событий public void MayBeStart(){ Random rand = new Random(); if(rand.Next(0,2)==0) Run("Беги, Лола, Беги"); } public void MayBeStop(){ Random rand = new Random(); if(rand.Next(0,2)==0) Stop("Стоп,Машина"); } public enum Sex{Male,Female}; private Sex p; private string name; private string surname; private int age; public Human(){ name = surname = "Нет Данных"; age = 0; p = Sex.Male; } public Human(string name,string surname,int age,Sex p){ this.name = name; this.surname = surname; this.age = age; this.p = p; } public string Name{ get{ return name; } set{ name = value; } } public string Surname{ get{ return name; } set{ name = value; } } public int Age{ get{ return age; } set{ age = value; } } public Sex RealSex{ get{ return p; } set{ p = value; } } } //======================================================= // Класс для обработчиков событий //======================================================= class HumanEventSink{ // Обработчики событий public void OnRun(string msg){ Console.WriteLine("В HumanEventSink OnRun:"+msg); } public void OnStop(string msg){ Console.WriteLine("В HumanEventSink OnStop:"+msg); } public void OnRun2(string msg){ Console.WriteLine("В HumanEventSink OnRun2:"+msg); } } //======================================================= class Sample{ public static void Main(){ HumanEventSink envs = new HumanEventSink(); Human obj = new Human(); //======================================================= Human.Run += new Human.HumanHandler(envs.OnRun); Human.Stop += new Human.HumanHandler(envs.OnStop); //======================================================= Console.WriteLine("\n*****************************************\n"); for(int i = 0;i<5;i++) obj.MayBeStart(); Console.WriteLine("\n*****************************************\n"); for(int i = 0;i<5;i++) obj.MayBeStop(); //======================================================= Human.Run += new Human.HumanHandler(envs.OnRun2); Console.WriteLine("\n*****************************************\n"); for(int i = 0;i<5;i++) obj.MayBeStart(); //======================================================= Human.Run -= new Human.HumanHandler(envs.OnRun2); Console.Read(); } } |
|
Библиотека программиста. 2009. |
|