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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели на функции(делегаты) - смысл? по примерам с мсдн непонятно 
:(
    Опции темы
Gunslinger
  Дата 25.8.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Похоже я не программист - смотрю мсдн и не могу понять их смысл. Сама оболочка вроде понятна - чтобы было видно, к какому участку памяти, зачем обращаемся и что получаем. А сам смыл указателя непонятен. Нельзя в качестве параметра передать метод. Наверное, техническая причина, но зачем передавать сам метод, когда можно передать объект, его содержащий, а затем уже его вызвать?

В с++ указатели на методы еще понять могу: нужно обратиться к функции в dll, которая висит в памяти. 
PM MAIL   Вверх
ДобренькийПапаша
Дата 25.8.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Цитата(Gunslinger @  25.8.2010,  12:49 Найти цитируемый пост)
Нельзя в качестве параметра передать метод.

С помощью делегата можно! smile

Цитата(Gunslinger @  25.8.2010,  12:49 Найти цитируемый пост)
зачем передавать сам метод, когда можно передать объект, его содержащий, а затем уже его вызвать?


Ну уж хотя бы потому, что при инициализации объекта вы затратите чёрт знает (разработчик знает) сколько памяти. А при вызове через делегат - расход только на делегат.
Енто раз.

События, основанные на делегатах реализуют модель издатель-подписчик, что является хорошим тоном, грамотным архитектурным решением при работе с событиями.

Енто два.

С помощью делегатов можно делать последовательность вызовов функций (поскольку к делегату можно прицепить не одну функцию).

Енто три.

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

Енто четыре.

Например, возьмём LINQ.

Берём любой int массив обыкновенный (System.Array)

Код

int[] a = {3,1,5,4,2,7,4,3};

IEnumerable b = a.Where(n=>n>2); //b содержит все числа из массива а, которые больше двух


Функция Where принимает делегат Predicate(здесь я написал лямбда-выражение).
Благодаря делегатам пользовать массива может делать что хочет, задавать какие хочешь функции для работы с массивом, чтобы вернуть то, что надо.


Это сообщение отредактировал(а) ДобренькийПапаша - 25.8.2010, 13:30


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
mrbrooks
Дата 25.8.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



Цитата(Gunslinger @  25.8.2010,  13:49 Найти цитируемый пост)
Наверное, техническая причина, но зачем передавать сам метод, когда можно передать объект, его содержащий, а затем уже его вызвать?

интересно - а каким ты образом реализуешь события на такой архитектуре? smile

ничего ацкого в делегатах нет. как ты уже и говорил - делегаты это просто указатели на функции( только типобезопасные), т.е. это как callback функции в С++. 

Цитата(Gunslinger @  25.8.2010,  13:49 Найти цитируемый пост)
В с++ указатели на методы еще понять могу: нужно обратиться к функции в dll, которая висит в памяти.  

ха! посмотри тот же STL. Да там все алгоритмы реализованы с предикатами. А это и есть ни что иное, как указатели на функции.

Так что по аналогии с С++ все симметрично + безопасность + дополнительный функционал объекта папы-делегата (см. док)

Добавлено через 2 минуты и 6 секунд
в общем твоя проблема не в делегатах - а в смысле функций обратного вызова - как таковых smile 
PM MAIL   Вверх
Gunslinger
Дата 25.8.2010, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Цитата(mrbrooks @  25.8.2010,  13:59 Найти цитируемый пост)
в общем твоя проблема не в делегатах - а в смысле функций обратного вызова - как таковых

Почитал вики с гуглом. Сформулировал вопрос: причина введения в язык указателей на функции (как их называют "обратного вызова") -- технические или архитектурные? Из-за специфики железа (связанные со стеком или еще чем) или из-за плюшек с той же событийной модели? Читаю и не могу выделить основную причину.
PM MAIL   Вверх
ДобренькийПапаша
Дата 25.8.2010, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Сейчас основная причина - архитектурная. Событийная модель издатель-подписчик это комильфо!  ИМХО smile 


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
mrbrooks
Дата 26.8.2010, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



Цитата(Gunslinger @  25.8.2010,  19:12 Найти цитируемый пост)
архитектурные? 

да

Цитата(Gunslinger @  25.8.2010,  19:12 Найти цитируемый пост)
из-за плюшек с той же событийной модели?

да.


PM MAIL   Вверх
Gunslinger
Дата 30.8.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Мсдн, интуит, гугл, книги.. Щас каша в голове. Архитектурно мой мозг имеет такая схема:
1. Объект-отправитель - класс с event-полями, которые на самом деле не поля, а классы.
2. Объект-получатель - класс, где есть метод(ы) для активации по событию. 
Связь. Где что пишут, даже не знаю, что правильно. Варианты, какие прочитал:
1. В объект-получатель передать ссылку на объект-отправитель, вызвать его event-поле и присвоить метод-обработчик.
2. 
Код

public Forml() 

    InitializeComponent (); 
    buttonOne.Click += new EventHandler(Button_Click); 


Либо это "обложка" для программиста и на самом деле компилятор "развернет" его по варианту 1. Т.е. в нечто вроде этого:
Код

public delegate void EventHandler();

public class Forml() 

    private Button buttonOne;
    public Forml(Button buttonOne){ 
             buttonOne.Click += EventHandler(Button_Click);
    }; 
    public void Button_Click() { Console.WriteLine("Button clicked"); };



либо есть несколько способов подписаться на событие.

Это сообщение отредактировал(а) Gunslinger - 30.8.2010, 10:24
PM MAIL   Вверх
KelTron
Дата 30.8.2010, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 11
Всего: 38



Возьми Троелсена и почитай главу про делегаты и события, там всё очень хорошо разъясняется. Твои вопросы отпадут сами собой..


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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