![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: нет Всего: 3 |
Похоже я не программист - смотрю мсдн и не могу понять их смысл. Сама оболочка вроде понятна - чтобы было видно, к какому участку памяти, зачем обращаемся и что получаем. А сам смыл указателя непонятен. Нельзя в качестве параметра передать метод. Наверное, техническая причина, но зачем передавать сам метод, когда можно передать объект, его содержащий, а затем уже его вызвать?
В с++ указатели на методы еще понять могу: нужно обратиться к функции в dll, которая висит в памяти. |
|||
|
||||
ДобренькийПапаша |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 14.1.2006 Где: г.Москва Репутация: 3 Всего: 7 |
С помощью делегата можно! ![]()
Ну уж хотя бы потому, что при инициализации объекта вы затратите чёрт знает (разработчик знает) сколько памяти. А при вызове через делегат - расход только на делегат. Енто раз. События, основанные на делегатах реализуют модель издатель-подписчик, что является хорошим тоном, грамотным архитектурным решением при работе с событиями. Енто два. С помощью делегатов можно делать последовательность вызовов функций (поскольку к делегату можно прицепить не одну функцию). Енто три. Если вы разрабатываете код, который будет кем-то унаследован и дорабатываем, то когда вы предоставляете какой-то функционал, вы не знаете как его конкретно захочет использовать тот, кто будет использовать ваш код. Енто четыре. Например, возьмём LINQ. Берём любой int массив обыкновенный (System.Array)
Функция Where принимает делегат Predicate(здесь я написал лямбда-выражение). Благодаря делегатам пользовать массива может делать что хочет, задавать какие хочешь функции для работы с массивом, чтобы вернуть то, что надо. Это сообщение отредактировал(а) ДобренькийПапаша - 25.8.2010, 13:30 -------------------- Меня зовут Себастьян Парейра, торговец чёрным деревом. |
||||
|
|||||
mrbrooks |
|
||||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 17 Всего: 306 |
интересно - а каким ты образом реализуешь события на такой архитектуре? ![]() ничего ацкого в делегатах нет. как ты уже и говорил - делегаты это просто указатели на функции( только типобезопасные), т.е. это как callback функции в С++.
ха! посмотри тот же STL. Да там все алгоритмы реализованы с предикатами. А это и есть ни что иное, как указатели на функции. Так что по аналогии с С++ все симметрично + безопасность + дополнительный функционал объекта папы-делегата (см. док) Добавлено через 2 минуты и 6 секунд в общем твоя проблема не в делегатах - а в смысле функций обратного вызова - как таковых ![]() |
||||
|
|||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: нет Всего: 3 |
Почитал вики с гуглом. Сформулировал вопрос: причина введения в язык указателей на функции (как их называют "обратного вызова") -- технические или архитектурные? Из-за специфики железа (связанные со стеком или еще чем) или из-за плюшек с той же событийной модели? Читаю и не могу выделить основную причину. |
|||
|
||||
ДобренькийПапаша |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 14.1.2006 Где: г.Москва Репутация: 3 Всего: 7 |
Сейчас основная причина - архитектурная. Событийная модель издатель-подписчик это комильфо! ИМХО
![]() -------------------- Меня зовут Себастьян Парейра, торговец чёрным деревом. |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 17 Всего: 306 |
||||
|
||||
Gunslinger |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: нет Всего: 3 |
Мсдн, интуит, гугл, книги.. Щас каша в голове. Архитектурно мой мозг имеет такая схема:
1. Объект-отправитель - класс с event-полями, которые на самом деле не поля, а классы. 2. Объект-получатель - класс, где есть метод(ы) для активации по событию. Связь. Где что пишут, даже не знаю, что правильно. Варианты, какие прочитал: 1. В объект-получатель передать ссылку на объект-отправитель, вызвать его event-поле и присвоить метод-обработчик. 2.
Либо это "обложка" для программиста и на самом деле компилятор "развернет" его по варианту 1. Т.е. в нечто вроде этого:
либо есть несколько способов подписаться на событие. Это сообщение отредактировал(а) Gunslinger - 30.8.2010, 10:24 |
||||
|
|||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 11 Всего: 38 |
Возьми Троелсена и почитай главу про делегаты и события, там всё очень хорошо разъясняется. Твои вопросы отпадут сами собой..
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |