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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2012, 13:23   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,305
По умолчанию Зачем нужны события (event) ?

Вот что-то читал Шилдта, там говорилось о сверх-супер-пупер важности событий. Читаю Троелсена, там тоже говорится, мол это очень-очень важно. А я вот сижу и не понимаю, на кой черт их придумали? Можно с таким же успехом обойтись и с делегатами? У Э.Троелсена написано, что мол это помогает сократить количество кода. Пожалуйста, приведите мне хоть мало-мальский пример или ситуацию, когда они делают работу удобнее?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 30.07.2012, 13:46   #2
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

События и делегаты не разрывно связаны меж собой. Вы говорите, что можно обойтись лишь делегатами, но разве события не возвращают делегат?
В Qt для организации сигналов и слотов необходим moc-компилятор, а в C# все сделано на уровне языка.
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Старый 30.07.2012, 14:52   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,305
По умолчанию

Цитата:
но разве события не возвращают делегат?
Эмм.... нет. События в организуются в CIL коде как 2 метода add_XXX и remove_XXX, которые возвращают тип, который возвращает делегат. Например, если есть вот такой кусок кода:
Код:
class Demo
{
       public delegate void CarEventHandler(string msg);

       public event CarEventHandler Exploded;
       ......
}
То CIL код будет составлен так:

Цитата:
.method public hydebysiq specialname instance void
add_Exploded(class CarEvents.Demo/CarEventHandler 'value')
....
Т.е. события принимают делегат, как аргумент, а не возвращают его.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 30.07.2012, 15:03   #4
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

Т.е. Вы готовы предложить иную релизацию событиям? Не думаю, что Ваша замена будет достойной.
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Старый 30.07.2012, 15:58   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
Зачем нужны события (event) ?
Для осуществления рассылки об изменении своего состояния другим объектам (возможно и другого типа). Короче для спама

Цитата:
Пожалуйста, приведите мне хоть мало-мальский пример или ситуацию, когда они делают работу удобнее?
Всегда практически. Тут в чем смысл - на уровне кода нет особой разницы. Просто так удобней для восприятия программистам, а чаще конкретно создателям.
Ситуация - ну как и везде пример это оконный интерфейс. Вы навешиваете метод и обрабатываете событие, например мыши .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 30.07.2012 в 16:03.
Utkin вне форума Ответить с цитированием
Старый 30.07.2012, 16:01   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

MooNDeaR, в общем случае события это список делегатов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.07.2012, 16:07   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
А я вот сижу и не понимаю, на кой черт их придумали? Можно с таким же успехом обойтись и с делегатами?
А очень просто. Исторически события появились раньше делегатов .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 30.07.2012, 16:21   #8
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Цитата:
Исторически события появились раньше делегатов
и именно поэтому они используют делегаты. событие это просто уровень абстракции над делегатом, типо можем только добавлять удалять, не можем присваивать, эти операции поумолчанию потокобезопастны, конечно можно обойтись и без них.
Для чего они нужны? чтобы кто-то не мог удалить случайно что-нить лишнее, присвоив null например

Последний раз редактировалось Reskov; 30.07.2012 в 16:23.
Reskov вне форума Ответить с цитированием
Старый 30.07.2012, 16:25   #9
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,305
По умолчанию

Цитата:
Вы навешиваете метод и обрабатываете событие
А почему я не могу навесить этот метод напрямую переменной-делегату? нафига мне какое-то абстрактное "событие", ведь по сути это тупо переменная-делегат?
Цитата:
MooNDeaR, в общем случае события это список делегатов.
Тогда зачем было выделять одно из другого?
Цитата:
Т.е. Вы готовы предложить иную релизацию событиям? Не думаю, что Ваша замена будет достойной.
Да, вполне могу предложить.

Код:
class Demo
{
       public delegate void CarEventHandler(string msg);

       public CarEventHandler Exploded;
       ......
}
И тупо делать присваивание делегату Exploded. В чем разница? Вот такой, например, код:
Код:
class Program
    {
        static void Main(string[] args)
        {
            Car Vehicle = new Car();

            Vehicle.Exploded += CarEvent;
        }

        static void CarEvent(string msg)
        {
            Console.WriteLine(msg);
        }
    }

    class Car
    {
        public delegate void CarEventHandler(string msg);

        public CarEventHandler Exploded; //Просто делегат, и никакое не событие.
    }
Вполне себе рабочий. Напиши хоть там event ничего не изменится ни в логике, не в кол-ве кода (который разбухнет аж на 5 символов).
Цитата:
Для чего они нужны? чтобы кто-то не мог удалить случайно что-нить лишнее, присвоив null например
Это ж в какой такой вселенной найдется человек, присваивающий "случайно" null делегату? С таким же успехом он может и событию просто ничего не присвоить. Разве что он не может вызвать событие напрямую из внешнего кода, тем самым увеличится инкапсуляция и бла-бла-бла...))) Как я порой ненавижу ООП из-за вот таких штук.

P.S.
Вроде понял, короче
Спасибо.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 30.07.2012 в 16:40.
MooNDeaR вне форума Ответить с цитированием
Старый 30.07.2012, 19:38   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
нафига мне какое-то абстрактное "событие", ведь по сути это тупо переменная-делегат?
Я уже ответил на Ваш вопрос - это просто модель представления процессов в мозгу программиста. В конечном итоге нет никаких делегатов и событий, есть только команды процессора. А если опустится на уровеньь ниже, то электроны и полупроводниковые переходы. Суть ясна? Когда Вы едете в машине Вы же следуете определенным правилам, хотя езда на красный свет или по пешеходному переходу физически возможна. Еще пример - возможно успешное программирование с участием goto. Однако сейчас от него отказались. Это программирование программиста. Разработчики заложили определенную модель, которая Вам навязывается при программировании. Не нравится, пишите код через одно место, я думаю процессор на Вас не обидится.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зачем нужны многомерные массивы? Sёker Общие вопросы Delphi 13 13.05.2012 15:42
Зачем нужны классы Sylar9 Общие вопросы C/C++ 5 15.03.2012 11:38
Зачем нужны блок-схемы? fs444 Общие вопросы по программированию, компьютерный форум 31 27.01.2010 04:11
Зачем нужны операторы << и >> fs444 Общие вопросы C/C++ 3 23.12.2009 08:07
Объект события Event Gerzs Общие вопросы Delphi 0 01.11.2009 10:08