• Добро пожаловать на сайт - Forumteam.digital !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

35. Происходящие события.

Redman

<FORUMTEAM>
Команда форума
Регистрация
13.11.17
Сообщения
13.340
Реакции
8.377
Баллы
1.200
FTC
208¢
События.
Понятие события вам уже известно из курса программирования под 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();           
           
    }
}
 
Сверху Снизу