![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
![]()
Уважаемые форумчане. Заранее прошу прощения за копи-паст из одной ветки форума в другой, просто решил, что здесь этому вопросу вернее лежать.
Пытаюсь разобраться в событиях. Возник следующий вопрос. Как я понял есть короткая (сокращенная) запись определения события. Выглядит она вот так: Код:
В ней же пишется, что длинная форма сокращенной нотации выглядит следующим образом: Код:
Код:
Код:
Код:
Код:
Думаю, ладно. Пойду по пути наименьшего сопротивления. Просто удалю эту строчку, авось компилятор сам за меня создаст этот делегат, тем более на хабре нашел какую-то статью, в которой длинная запись события используется именно без объявления приватного делегата. Значит меняю код события на следующий: Код:
Код:
Люди добрые, помогите разобраться, как в данном случае использовать полную запись события? |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]()
Учебник врет, event и делегат - совсем не эквивалентные вещи, хотя и похожие по свойствам.
Event - это "обертка" для делегата, которая позволяет только подписаться на событие, или отписаться от него, но не позволяет получить ссылку на сам объект делегата, тем самым обеспечивая инкапсуляцию. В вашем случае я бы оставил "полную" запись (с event-ом и приватным делегатом), а invoke делал бы именно делегату. (EventHandler<CarInfoEventArgs> newCarInfo =this.NewCarInfo). Публичные делегаты - вещь весьма опасная, да и корявая по своей сути. Для этого event'ы и придумали
Благодарить в репутацию. Проклинать — туда же
![]() |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
стоп стоп стоп. ключевое слово delegate служит для объявления типа делегата.
эквивалент короткой записи события это: Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#4 | |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]() Цитата:
Благодарить в репутацию. Проклинать — туда же
![]() |
|
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
![]()
Фух. Спсибо большое за помощь. А то я чуть голову не сломал, где загвоздка. Ох уж эти книги... Нельзя им доверять. На одну главу как минимум уже вторая опечатка. Точнее в первый раз были издержки перевода касаемо группового делегата. Когда через foreach он добавлял лямбда-выражения. А в книге было написано, что он суммировал их о_О.
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
![]()
Да-да. Я уже тоже посмотрел и сообразил, что я пытался таким образом объявить свой собственный делегат, который имеет имя такое же как уже у существующего (созданного создателями C#) делегата. Еще раз всем спасибо за помощь.
На очереди разбор вопроса касаемо слабый событий и WeakEventManager. Больно запутанная история там получается. |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
![]()
С событием, построенным на базовом делегате EventHandler<T> я вроде разобрался. Но что-то пока не могу разобраться вот с какой штукой.
Используя полную версию определения события хочу вставить туда вот такую строчку, которая выводила бы, что на события такого-то экземпляра подписался такой-то прослушиватель. Чтобы это выглядело как-то так: Код:
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]()
Имя метода-обработчика события - value.Method.Name
Имя класса, в котором обработчик события - value.Method.DeclaringType.Name
Благодарить в репутацию. Проклинать — туда же
![]() |
![]() |
![]() |
![]() |
#9 | |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
![]() Цитата:
Есть класс-издатель - CarDealer. Есть класс-прослушиватель Consumer. В классе Consumer есть стринговая переменная name. Так вот реально ли в определение события (в блок add и remove вставить код, использующий значение этой переменной) Например, создан экземпляр класса-прослушивателя vasya, в котором name="Vasya". Так же создан экземпляр класса-издателя misha, в котором dealer="Misha". Необходимо, чтобы при подписке vasya на misha выводилась на консоль следующая строчка: Misha have a new listener - Vasya. Реально ли это как-нибудь получить? |
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]()
Не думаю
Благодарить в репутацию. Проклинать — туда же
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
C# События. "Короткая" и "длинная" записи. | max_prorok | Помощь студентам | 0 | 16.03.2016 16:57 |