Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> event, что это? 
:(
    Опции темы
Coocky
Дата 4.4.2005, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Вопрос у меня возник-что такое event-оператор?Наверное нет.Хотя и синенький.Не связано ли это как то с многозадачностью?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
stab
Дата 5.4.2005, 05:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 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.
PM MAIL WWW   Вверх
mr.DUDA
Дата 5.4.2005, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



На firststeps приведён только код. Попробую объяснить "на пальцах", что такое event.

Итак, ключевое слово event употребляется для объявления в классе события с заданным именем и заданным типом обработчика события. Для задания типа обработчика события используется имя делегата (aka "тип указателя на метод класса"). К примеру:
Цитата
public class ClassWithEvent
{
  public event EventHandler MyEvent;
}

В данном примере, класс ClassWithEvent содержит событие с именем MyEvent и "стандартным" типом обработчика EventHandler. "Тип обработчика" на самом деле надо читать как "тип делегата" smile, но если с делегатами пока туговато, то сойдёт и так.

Теперь про то, как работают события. Итак:
1) Сгенерировать событие можно только из метода того же класса, в котором объявлено событие. Это логично, т.к. событие "публикуется" классом как его неотъемлемая часть. Пример генерации события:
Цитата
public class ClassWithEvent
{
    public event EventHandler SomeEvent;

    public void FireEvent()
    {
        if(this.SomeEvent != null)
            this.SomeEvent(this, new EventArgs());
    }
}

В примере описан метод FireEvent, который проверяет, подписан ли кто-либо на событие SomeEvent (обычная проверка на null) и если да - то генерит событие, передавая обработчикам 2 аргумента (исходя из типа обработчика - EventHandler): ссылку на себя и некий абстрактный объект EventArgs, содержащий инф-цию о событии.

2) Обработчиком события может быть любой метод любого класса. Подписка на событие выполняется точно таким же образом, как присоединение метода к делегату, т.е. с помощью оператора "+=":
Цитата
public class ClassWithHandler
{
    public void TheEventHandler(object sender, EventArgs e)
    {
    }

    public void AttachToEvent(ClassWithEvent obj)
    {
          obj.SomeEvent += new EventHandler(this.TheEventHandler);
    }
}

В примере описан класс, содержащий обработчик события (TheEventHandler) и метод, подписывающий объект класса ClassWithHandler на событие SomeEvent заданного объекта ClassWithEvent.

Надеюсь, теперь всё стало на свои места. smile

P.S, с многозадачностью оператор event никак (напрямую) не связан.


--------------------
user posted image
PM MAIL WWW   Вверх
alir
Дата 5.4.2005, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 19.3.2005

Репутация: 2
Всего: 4



Согласитесь: как-то муторно в C# сделаны события - никак привыкнуть не могу. В java сразу понятно стало и легко применять, а здесь... smile

ИМХО По-моему, перемудрили. smile

p.s. Может кто приведет вразумительное объяснение вот такой организации событий в .net.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 6.4.2005, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



alir, всё тут просто и логично:

1) Событие - это объект. Событие, как и поле, является class member'ом.
2) У события есть явно заданный тип обработчика. Тип обработчика точно описывает сигнатуру метода, который является обработчиком. Сигнатуру метода в шарпе описывают делегаты.
3) На событие могут подписаться от 0 до N различных методов. Генерация события приводит к вызову одного за другим этих N методов. Чтобы хранить где-то инфу об указателях на this и самих методах, и нужен именно объект события (см. п. 1)
4) Сгенерировать событие может только класс, который это событие "выставляет наружу". Всё правильно. Класс "кнопка" генерирует событие Clicked, больше никому это делать не позволено (разве только косвенным образом или если уж сильно нужно - вызовом метода "DoClick" класса "кнопка").

Если не согласен с тем, что всё просто, опиши реализацию событий в JAVA.


--------------------
user posted image
PM MAIL WWW   Вверх
alir
Дата 6.4.2005, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 19.3.2005

Репутация: 2
Всего: 4



mr.DUDA
Цитата
Если не согласен с тем, что всё просто, опиши реализацию событий в JAVA.


Реализацию событий можно делать по разному в java. Я, в основном, пользуюсь следующим методом. Пусть нам нужно задать событие кнопки. Делается ЭЛЕМЕНТАРНО:
Код

JButton b = new JButton("Name");
      b.addActionListener(new ActionListener()
         {  
            public void actionPerformed(ActionEvent event)
            {  
               /* действия с кнопкой */
            }
         });


Можно еще проще (меньше писать):
Код

addButton(buttonPanel, "Name",
         new ActionListener()
            {  
               public void actionPerformed(ActionEvent evt)
               {
                   /* действия с кнопкой */
               }
            });


Еще можно задать в более общем виде:
Код

JButton b = new JButton("Name");
//обьевляем событие
 ActionListener listener = new ActionListener()
  {  
            public void actionPerformed(ActionEvent event)
            {  
                /* действия */
            }
 };
//добавляем событие объекту
b.addActionListener(listener);


Вот и все! Все очень просто!
PM MAIL ICQ   Вверх
mr.DUDA
Дата 6.4.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(alir @ 6.4.2005, 11:12)
Вот и все! Все очень просто!

Ok, это про кнопку, тут всё ясно. А как насчёт объявления, генерации и обработки событий в своих классах ?

З.Ы. Пока что ничего особенного, кроме анонимных классов типа listener'а я не увидел... Во 2-м .NET Framework появился анонимный делегат, с пом. которого можно написать идентичный код вышеприведённому.


--------------------
user posted image
PM MAIL WWW   Вверх
arilou
Дата 6.4.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(alir @ 6.4.2005, 11:12)
Вот и все! Все очень просто!

Или я чего-то не понимаю, или ты описал как подсоединиться к событию, в отличии от mr.DUDA, который описал, как его объявить в своем классе.

В C# подсоединение обработчика к событию делается тоже просто:

Код


protected Button b = new Button();
void AttachHandler()
{
  // присоединяем обработчик
  b.Click += new EventHandler(button1_Click);
}

private void button1_Click(object sender, EventArgs e)
{
  // I AM CLICKED! :)
}


К слову, в VB.NET объявить еще проще чем в C#:

Код

public class ClassWithEvents
  public event MyEvent(eventParam1 as Integer, eventParam2 as String)

  protected sub RaiseMyEvent()
    RaiseEvent MyEvent(10, "my event")
  end sub
end class


Т.е. объявление делегата и события объединены.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Coocky
Дата 6.4.2005, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



mr.DUDA
Спасибо.Вот только вопрос-СОБЫТИЕ.....Это слово,которое подразумевает под собой в API и MFC,либо это что-то не связаное с системой(надеюсь понятно вопрос задал) smile ,или какое-то глобальное понятие.


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
mr.DUDA
Дата 6.4.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Событие - это элемент языка C#, никоим образом не связанный с ОС.


--------------------
user posted image
PM MAIL WWW   Вверх
Domestic Cat
Дата 7.4.2005, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(mr @ 6.4.2005, 03:13)
Ok, это про кнопку, тут всё ясно. А как насчёт объявления, генерации и обработки событий в своих классах ?


Раз зашел разговор, то то, что написал alir и есть "делегат". Все эти делегаты-ивенты делают просто-напросто одну вешь - вызывают некий метод или несколько методов, причем эти методы можно регистрировать ва качетве делегатов и убирать из списка делегатов.
Подноготная всего этого дела действительно сложновата - во-первых введены два ключевых слова, оба - типы. Во-вторых, компилятор для них генерит свои классы, в которых регистрируется "ссылка на метод".

В Java все то же самое - можно зарегистрировать/убрать листенер (т.е. делегат), при возникновении "события" будут вызваны определенные методы всех зарегистрированных листенеров. Если интересно, как это делается, могу рассказать, но на всякий случай оффтопить не буду; суть такая - листенер можно написать и понять как он работает на 100%, делегат можно написать, но вряд ли кто из вас (я - точно), знает, ЧТО ИМЕННО передается делегату, и каким будет код делегата (закрыв глаза, без илдасма).

В общем, лично я никаких различий между делегатами и листенерами не вижу, за исключением того, что в шарпе используется немного "магии", что делает делегаты немного более сложными для понимания.


--------------------

PM   Вверх
mr.DUDA
Дата 7.4.2005, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Domestic @ 7.4.2005, 02:14)
Все эти делегаты-ивенты делают просто-напросто одну вешь - вызывают некий метод или несколько методов, причем эти методы можно регистрировать ва качетве делегатов и убирать из списка делегатов.


Цитата(Domestic @ 7.4.2005, 02:14)
В Java все то же самое - можно зарегистрировать/убрать листенер (т.е. делегат), при возникновении "события" будут вызваны определенные методы всех зарегистрированных листенеров.


[offtop] некоторые (начинающие) программисты С++ до сих пор изобретают свой тип VARIANT... [/offtop]

Так ведь и в шарпе можно организовать такую же схему (им. ввиду листенеры). События и делегаты зашиты в язык, чтобы программерам не надо было изобретать велосипед. И не так уж и сложна для понимания "вся подноготная" делегатов, про неё можно почитать хоть у Троелсена.


--------------------
user posted image
PM MAIL WWW   Вверх
Domestic Cat
Дата 7.4.2005, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(mr @ 6.4.2005, 22:38)
Так ведь и в шарпе можно организовать такую же схему (им. ввиду листенеры). События и делегаты зашиты в язык, чтобы программерам не надо было изобретать велосипед. И не так уж и сложна для понимания "вся подноготная" делегатов, про неё можно почитать хоть у Троелсена.


Может, ты и прав, я спорить не буду; по сути делегаты хороши в тех случаях, когда их нужно создавать для твоей собственной обработки твоих же событий - тогда они позволяют уменьшить немного работу, за счет непонятности. В целом же, по функциональности или обработке стандартных ивентов делегаты аналогичны листенерам.

Мое предложение: чтобы не было более таких оффтопов, давайте создадим тему типа Java или .NET?, на обеих форумах, где и будем вести цивилизованный разговор - если это конечно интересно.


--------------------

PM   Вверх
mr.DUDA
Дата 7.4.2005, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Domestic @ 7.4.2005, 07:45)
Мое предложение: чтобы не было более таких оффтопов, давайте создадим тему типа Java или .NET?, на обеих форумах, где и будем вести цивилизованный разговор - если это конечно интересно.


Готово:
http://forum.vingrad.ru/index.php?showtopic=47924


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.