Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2010, 19:52   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию События и делегаты в C# как они работают

Здравствуйте. При изучении языка C# столкнулся с проблемой. Я не могу понять, как работают делегаты и события? Обрыл весь интернет и не нашел. Прошу приводить код. Извиняюсь если такая тема уже была.
Заранее Спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 31.01.2010, 21:43   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Та быть такого не может, чтоб в нете не было про одни из самых важных элементов одного из самых популярных языков.

Делегат - это контейнер для методов классов и других делегатов с общим заголовком.

Код:
class Test
{
	private string sName;

	public Test( string name )
	{
		sName = name;
	}

	public void func1( int arg )
	{
		Console.WriteLine( sName + " - " + (arg + 1).ToString() );
	}

	public static void func2( int arg )
	{
		Console.WriteLine(arg + 2);
	}
}

class Program
{
	private delegate void MyDelegate(int arg);


	static void Main(string[] args)
	{
		MyDelegate del = new MyDelegate(Test.func2);

		del += (new Test("my_object")).func1;
		del += Test.func2;

		del(5);

		Console.ReadKey();
	}
}
Вывод:
Код:
7
my_object - 6
7

Последний раз редактировалось Carbon; 31.01.2010 в 21:56.
Carbon вне форума Ответить с цитированием
Старый 31.01.2010, 21:54   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Событие - это по сути уже инициализированный объект делегата.
Код:
class Test
{
	private string sName;

	public Test( string name )
	{
		sName = name;
	}

	public void func1( int arg )
	{
		Console.WriteLine( sName + " - " + (arg + 1).ToString() );
	}

	public static void func2( int arg )
	{
		Console.WriteLine(arg + 2);
	}
}

class Program
{
	private delegate void MyDelegate(int arg);

	private static event MyDelegate ev;

	static void Main(string[] args)
	{
		MyDelegate del = new MyDelegate(Test.func2);

		del += (new Test("my_object")).func1;
		del += new MyDelegate(Test.func2);

		ev += del;
		ev += Test.func2;
		ev += (new Test("my_object1")).func1;

		ev(5);

		Console.ReadKey();
	}
}
Вывод:
Код:
7
my_object - 6
7
7
my_object1 - 6
Carbon вне форума Ответить с цитированием
Старый 31.01.2010, 22:03   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Мне очень понравилась одна вещь, очень удобно для создания потоков просто:
Код:
 // some code here
delegate()
{
  // to-do something here
}
// and some here
Супер. Ну так в добавок к теме
BOBAH13 вне форума Ответить с цитированием
Старый 01.02.2010, 07:18   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Ладно это я понял. А как связь с Событиями осуществляется?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 01.02.2010, 07:58   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А как связь с Событиями осуществляется?
Всмысле "связь"?
Вон же Carbon написал:
Цитата:
private delegate void MyDelegate(int arg);

private static event MyDelegate ev;
...
static void Main(string[] args)
{
MyDelegate del = new MyDelegate(Test.func2);

del += (new Test("my_object")).func1;
del += new MyDelegate(Test.func2);
...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.02.2010, 11:30   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от _PROGRAMM_ Посмотреть сообщение
А как связь с Событиями осуществляется?
В смысле "связь"? Связь кого/чего с событиями?
Carbon вне форума Ответить с цитированием
Старый 01.02.2010, 18:23   #8
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Что-то я по делегатам и вашему примеру, вообще ничего не понял. Погонял его в режиме отладки и не понял вообще зачем это надо.
Casper-SC вне форума Ответить с цитированием
Старый 02.02.2010, 03:27   #9
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

эххххххх! А так понятнее?

Код:
class MyComponent
{

	public delegate void Callback( int message, MyComponent sender );
	private Dictionary< int, Callback > dMessageMap;

	public MyComponent()
	{
		dMessageMap = new Dictionary< int, Callback >();
	}

	public void addListener( int message, Callback listener )
	{
		if (listener != null)
			if (dMessageMap.ContainsKey(message)) dMessageMap[message] += listener;
			else dMessageMap[message] = new Callback(listener);
	}


	protected void send( int message )
	{
		if (dMessageMap.ContainsKey(message)) dMessageMap[message](message, this);
	}
}


class MyButton : MyComponent
{

	private string sName;

	public const int ON_CLICK = 0;

	public MyButton( string name )
	{
		sName = name;
	}

	public void click()
	{
		send(ON_CLICK);
	}

	public string getName()
	{
		return sName;
	}
		
}


class MyReciever
{
	private string sName;

	public MyReciever(string name)
	{
		sName = name;
	}

	public void onClick( int message, MyComponent sender )
	{
		Console.WriteLine( "Button name \'{0}\' was clicked. Reciever \'{1}\'", ( ( MyButton )sender ).getName(), sName );
	}

}


class Program
{
	static void Main(string[] args)
	{

		MyButton button = new MyButton("button 1");

		button.addListener(MyButton.ON_CLICK, (new MyReciever("listener 1")).onClick);
		button.addListener(MyButton.ON_CLICK, (new MyReciever("listener 2")).onClick);

		button.click();

		Console.ReadKey();
	}
}
Тока не надо спрашивать "Что такое Dictionary и почему это не компилица?".

Последний раз редактировалось Carbon; 02.02.2010 в 03:29.
Carbon вне форума Ответить с цитированием
Старый 02.02.2010, 07:49   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Значит рекомендую почитать книгу Герберт Шилдт - C# Учебный Курс
на 426 странице - там все расписано.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работают программы обходящие NAT? Pedro Свободное общение 4 20.01.2010 17:20
Подскажите как исправить отображение пузырьков в столбик, так что бы они отображались в строчку и... Harle Помощь студентам 2 12.01.2010 20:21
Как перенести обработчик события? HTL Общие вопросы Delphi 9 07.01.2010 01:03
Как стереть данные в паспорте? Коли они там имеются. Izhic Свободное общение 30 10.05.2009 19:39
Делегаты в MSIL Андрей Стрелков Общие вопросы .NET 6 20.02.2009 19:17