Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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.
Администратор: admin@programmer-lib.ru