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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2012, 04:48   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос Назначение обработчиков события

Использую C# уже около 3 лет и иногда просматривая код формы, написанной под WinForms, никогда не понимал почему присвоение событий для button и другого делается через '+='. Сейчас перешел на Mono/Gtk#, в котором этот код будет выглядеть следующим образом:
Код:
this.button1.Clicked += new global::System.EventHandler (this.OnButton1Clicked);//т.е. присвоить событию Clicked кнопки button1 метод OnButton1Clicked - все просто
Встала необходимость в своем классе, полем которого является класс SerialPort, переопределять событие DataReceived (еще раз подчеркну, именно переопределять). Поковырялся минут 5 с этой проблемой, но ничерта не получилось. Решил попробовать создать тестовый проект и попробовать переназначить событие для кнопки (смысл один и тот же - что там обработчик события, что тут). Пишу:
Код:
	protected void OnButton1Clicked (object sender, System.EventArgs e)
	{		
//переназначаю обработчик
		this.button1.Clicked += new global::System.EventHandler (this.OnButton1Clicked_SecondMethod);
	}

	protected void OnButton1Clicked_SecondMethod (object sender, System.EventArgs e)
	{
	//пример тестовый, поэтому неважно что будет делать второй обработчик сообщения	
		throw new ArgumentException();
		
	}
Ставлю breakpoint в методах OnButton1Clicked и OnButton1Clicked_SecondMethod. Чищу, пересобираю и запускаю проект в режиме отладки. Нажимаю на button1, как и ожидал, захожу в метод OnButton1Clicked, метод исполняется, нажимаю на button1 вновь и каким то "магическим" образом захожу в OnButton1Clicked (обработчик не переназначился), прерываю исполнение. Ладно, может быть проект криво собрался - повторяю все вышеописанные операции, но эффект тот же - проблема не в кривособранном проекте, а как бы прискорбно это ни звучало, в моем не понимании.
Начинаю смотреть описание событий, работу с ними, попутно работая в MonoDevelop и замечаю, что помимо оператора "+=", к System.EventHendler можно применить и "-=". Пробую:
Код:
	protected void OnButton1Clicked (object sender, System.EventArgs e)
	{	
//присвоить новый обработчик		
		this.button1.Clicked += new global::System.EventHandler (this.OnButton1Clicked_SecondMethod);
//удалить старый
		this.button1.Clicked -= new global::System.EventHandler (this.OnButton1Clicked);
	}
Запускаю в отладке и все исполняется ровно так, как мне и надо было.
Теперь небольшие вопросы:
1)как понимаю, в первом случае все работало в принципе правильно (второй тег CODE), только вместо выполнения при повторном нажатии на кнопку одного метода OnButton1Clicked_SecondMethod, исполнилось бы два метода: OnButton1Clicked и OnButton1Clicked_SecondMethod - каким тогда образом организовано событие Button.Clicked - массив, список или что-то иное?;
2)в каких конкретных случаях может быть полезна указанная методика (исполнение нескольких обработчиков на одно событие)?;
3)крайне интересно, почему к событиям нельзя применить простой операнд "="?;
4)каким образом можно удалить обработчики всех событий OnClick, заранее не зная наименования методов?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 03.10.2012 в 06:30.
Mixim вне форума Ответить с цитированием
Старый 03.10.2012, 10:26   #2
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

События - это особый вид делегатов, у них переопределены методы += и -= (скорее всего, я где-то ошибаюсь).

Насчет удаления ВСЕХ функций - не знаю, не сталкивался

Так, я бы посоветовал вам прочитать про события, вот тут : C# 4.0 полное руководство, или на msdn
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 04.10.2012, 08:34   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Восклицание

Цитата:
Сообщение от kaljan775 Посмотреть сообщение
Насчет удаления ВСЕХ функций - не знаю, не сталкивался

Так, я бы посоветовал вам прочитать про события, вот тут : C# 4.0 полное руководство, или на msdn
Примерно такую же фразу мне говорят многие знакомые, знающие C#: "Я точно не знаю, но врятли ты где-нибудь сможешь найти ответ на этот вопрос, т.к. этим никто не занимался". В принципе, т.к. я пишу свой код сам, могу просто обходить явное использование DataReceive и все (организовать доступ к нему через метод класса, а про возможность прямого доступа забыть), но по-моему это не самый удачный вариант - позже мой проект может продолжить реализовывать (совершенствовать) другой человек, который просто не будет знать, что отдельные моменты ему нужно забыть и тогда в мою сторону будет отпущено куча не совсем цензурной брани. Сам, столкнувшись с такой ситуацией, врятли бы вспомнил первоначального разработчика добрым словом!
Переговорив со своими знакомыми, пришел к выводу, что можно сделать класс для SerialPort, в которой данный класс использовать как поле с модификатором protected просто опубликовать и с помощью методов-оберток сделать открытыми/закрытыми определенные методы/события SerialPort, но по-моему это не самый удачный вариант.
Жалко, что C# не позволяет по-простому выполнить указанную задачу
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 04.10.2012, 10:32   #4
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

какие-то у тебя неправильные знатоки c#, это скучный вопрос про базовые возможности языка, ну кто будет тут тебе расписывать целую главу книги?

переопределить нельзя, удалить все обработчики нельзя, операнд = применить нельзя, внутри организовано через список, да.
Почему? глава книги "события"..
m0nax вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Назначение события кнопке, созданной в Internet Explorer artemavd Общие вопросы Delphi 6 02.07.2011 13:18
Назначение обработчиков для строк ListBox Byurrer Общие вопросы C/C++ 2 23.04.2011 16:10
Назначение обработчика события Gypsy Общие вопросы Delphi 2 22.12.2009 09:50
Назначение события EA_Sports Общие вопросы Delphi 2 11.03.2007 00:45