![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
Вопрос у меня возник-что такое event-оператор?Наверное нет.Хотя и синенький.Не связано ли это как то с многозадачностью?
-------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
Оператор event объявляет член-событие. Советую прикупить книжечку ".NET за 14 дней" и все сразу встанет на свои места. Вот еще пара ссылок по теме:
http://firststeps.ru/dotnet/r.php?98 http://firststeps.ru/dotnet/r.php?97 -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| mr.DUDA |
|
||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
На firststeps приведён только код. Попробую объяснить "на пальцах", что такое event.
Итак, ключевое слово event употребляется для объявления в классе события с заданным именем и заданным типом обработчика события. Для задания типа обработчика события используется имя делегата (aka "тип указателя на метод класса"). К примеру:
В данном примере, класс ClassWithEvent содержит событие с именем MyEvent и "стандартным" типом обработчика EventHandler. "Тип обработчика" на самом деле надо читать как "тип делегата" Теперь про то, как работают события. Итак: 1) Сгенерировать событие можно только из метода того же класса, в котором объявлено событие. Это логично, т.к. событие "публикуется" классом как его неотъемлемая часть. Пример генерации события:
В примере описан метод FireEvent, который проверяет, подписан ли кто-либо на событие SomeEvent (обычная проверка на null) и если да - то генерит событие, передавая обработчикам 2 аргумента (исходя из типа обработчика - EventHandler): ссылку на себя и некий абстрактный объект EventArgs, содержащий инф-цию о событии. 2) Обработчиком события может быть любой метод любого класса. Подписка на событие выполняется точно таким же образом, как присоединение метода к делегату, т.е. с помощью оператора "+=":
В примере описан класс, содержащий обработчик события (TheEventHandler) и метод, подписывающий объект класса ClassWithHandler на событие SomeEvent заданного объекта ClassWithEvent. Надеюсь, теперь всё стало на свои места. P.S, с многозадачностью оператор event никак (напрямую) не связан. -------------------- ![]() |
||||||
|
|||||||
| alir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 383 Регистрация: 19.3.2005 Репутация: 2 Всего: 4 |
Согласитесь: как-то муторно в C# сделаны события - никак привыкнуть не могу. В java сразу понятно стало и легко применять, а здесь...
ИМХО По-моему, перемудрили. p.s. Может кто приведет вразумительное объяснение вот такой организации событий в .net. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
alir, всё тут просто и логично:
1) Событие - это объект. Событие, как и поле, является class member'ом. 2) У события есть явно заданный тип обработчика. Тип обработчика точно описывает сигнатуру метода, который является обработчиком. Сигнатуру метода в шарпе описывают делегаты. 3) На событие могут подписаться от 0 до N различных методов. Генерация события приводит к вызову одного за другим этих N методов. Чтобы хранить где-то инфу об указателях на this и самих методах, и нужен именно объект события (см. п. 1) 4) Сгенерировать событие может только класс, который это событие "выставляет наружу". Всё правильно. Класс "кнопка" генерирует событие Clicked, больше никому это делать не позволено (разве только косвенным образом или если уж сильно нужно - вызовом метода "DoClick" класса "кнопка"). Если не согласен с тем, что всё просто, опиши реализацию событий в JAVA. -------------------- ![]() |
|||
|
||||
| alir |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 383 Регистрация: 19.3.2005 Репутация: 2 Всего: 4 |
mr.DUDA
Реализацию событий можно делать по разному в java. Я, в основном, пользуюсь следующим методом. Пусть нам нужно задать событие кнопки. Делается ЭЛЕМЕНТАРНО:
Можно еще проще (меньше писать):
Еще можно задать в более общем виде:
Вот и все! Все очень просто! |
||||||||
|
|||||||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Ok, это про кнопку, тут всё ясно. А как насчёт объявления, генерации и обработки событий в своих классах ? З.Ы. Пока что ничего особенного, кроме анонимных классов типа listener'а я не увидел... Во 2-м .NET Framework появился анонимный делегат, с пом. которого можно написать идентичный код вышеприведённому. -------------------- ![]() |
|||
|
||||
| arilou |
|
||||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Или я чего-то не понимаю, или ты описал как подсоединиться к событию, в отличии от mr.DUDA, который описал, как его объявить в своем классе. В C# подсоединение обработчика к событию делается тоже просто:
К слову, в VB.NET объявить еще проще чем в C#:
Т.е. объявление делегата и события объединены. |
||||||
|
|||||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
mr.DUDA
Спасибо.Вот только вопрос-СОБЫТИЕ.....Это слово,которое подразумевает под собой в API и MFC,либо это что-то не связаное с системой(надеюсь понятно вопрос задал) -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Событие - это элемент языка C#, никоим образом не связанный с ОС.
-------------------- ![]() |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Раз зашел разговор, то то, что написал alir и есть "делегат". Все эти делегаты-ивенты делают просто-напросто одну вешь - вызывают некий метод или несколько методов, причем эти методы можно регистрировать ва качетве делегатов и убирать из списка делегатов. Подноготная всего этого дела действительно сложновата - во-первых введены два ключевых слова, оба - типы. Во-вторых, компилятор для них генерит свои классы, в которых регистрируется "ссылка на метод". В Java все то же самое - можно зарегистрировать/убрать листенер (т.е. делегат), при возникновении "события" будут вызваны определенные методы всех зарегистрированных листенеров. Если интересно, как это делается, могу рассказать, но на всякий случай оффтопить не буду; суть такая - листенер можно написать и понять как он работает на 100%, делегат можно написать, но вряд ли кто из вас (я - точно), знает, ЧТО ИМЕННО передается делегату, и каким будет код делегата (закрыв глаза, без илдасма). В общем, лично я никаких различий между делегатами и листенерами не вижу, за исключением того, что в шарпе используется немного "магии", что делает делегаты немного более сложными для понимания. -------------------- |
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
[offtop] некоторые (начинающие) программисты С++ до сих пор изобретают свой тип VARIANT... [/offtop] Так ведь и в шарпе можно организовать такую же схему (им. ввиду листенеры). События и делегаты зашиты в язык, чтобы программерам не надо было изобретать велосипед. И не так уж и сложна для понимания "вся подноготная" делегатов, про неё можно почитать хоть у Троелсена. -------------------- ![]() |
||||
|
|||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Может, ты и прав, я спорить не буду; по сути делегаты хороши в тех случаях, когда их нужно создавать для твоей собственной обработки твоих же событий - тогда они позволяют уменьшить немного работу, за счет непонятности. В целом же, по функциональности или обработке стандартных ивентов делегаты аналогичны листенерам. Мое предложение: чтобы не было более таких оффтопов, давайте создадим тему типа Java или .NET?, на обеих форумах, где и будем вести цивилизованный разговор - если это конечно интересно. -------------------- |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Готово: http://forum.vingrad.ru/index.php?showtopic=47924 -------------------- ![]() |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |