![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| WolfTheGrey |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 21.1.2009 Где: forum.vingrad.ru Репутация: нет Всего: 2 |
Люди, пожалуйста, обьясните мне: для чего нужны Делегаты?????
Создавать и эксплуатировать их я научился, но так и не смог понять: зачем они? зачем усложнять жизнь процессору? Он и так загружен виндой Что мешает на прямую обратиться к методу и передать туда параметры? |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
а как ты предлагаешь это сделать и при этом избежать сильного связывания классов? что бы на прямую обращаться к методам другого класса, класс генерирующий событие должен знать об их существовании, а в случае делегатов он просто вызывает все что есть в делегате, и ему все равно какие классы на него подписались, класс генерирующий событие ничего про них не знает. а предположи что у тебя есть один класс генерирующий событие и десять слушающих, и что писать код для каждого слушающего класса? а если добавиться еще один тогда придется дописывать еще один вызов. |
|||
|
||||
| WolfTheGrey |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 21.1.2009 Где: forum.vingrad.ru Репутация: нет Всего: 2 |
Получается что всякий раз, как обращаюсь к методу чужого класса, я это должен делать через делегат?
тип того:
А какой вариант по созданию делегата правильнее использовать? первый или второй |
|||
|
||||
| mrbrooks |
|
||||||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
Простите - откуда такая информация?
Для того же, что callback-функции. т.е.
делегат - тоже самое - только гламурнее. Это сообщение отредактировал(а) mrbrooks - 23.3.2011, 10:41 |
||||||
|
|||||||
| WolfTheGrey |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 21.1.2009 Где: forum.vingrad.ru Репутация: нет Всего: 2 |
Как объяснили. То есть именно этот вопрос ни где не объясняется: Для чего это создано.
пожалуйста, по больше примеров (кода)
Я уже начал подумывать что Делегаты созданы защищать обращение к методам, как Свойства защищают обращение к переменным.
|
||||||||
|
|||||||||
| gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 5 Всего: 40 |
1. здесь делегат позволяет сократить код, за счет передачи метода который следует применить к коду
2. Для событий. мы описываем метод который должен должен быть в классе который на этот метод подписан. И мы уверены, что если класс подписан на событие, то метод с такой сигнатурой там по любому есть и просто вызываем его. Если попытаться как то это все сделать без делегатов, то мы свалимся в огромную кучу запутанного кода и слишком сильных сильных связей - и любой пук в коде приведет к полной жопе. |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
вот и с чего ты это взял? конечно нет, я просто привел пример полезности делегатов, если ты можешь в описанной мной ситуации обойтись без обратного вызова методов, то отлично. |
|||
|
||||
| WolfTheGrey |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 21.1.2009 Где: forum.vingrad.ru Репутация: нет Всего: 2 |
Понятно, делегаты нудны для событий.
А как на счет многопоточности? К примеру 3 фоновый поток обращается за инфой к 6 фоновому потоку. Это тоже лучше делать через делегат? |
|||
|
||||
| Voyager |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 532 Регистрация: 8.2.2005 Репутация: 3 Всего: 18 |
WolfTheGrey, читайте специализированную литературу, больше практикуйтесь и понимание придет. Приведу аналогию: как туземцу из экваториальной Африки объяснить что такое снег в Антарктике?
|
|||
|
||||
| Fitc |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 30.1.2010 Репутация: 3 Всего: 4 |
Приведу, как мне кажется, хороший пример:
Тут в DisplayMessages как видите в цикле не происходит каждый раз сравнение параметра currentOutputKind и в зависимости от его значения вызова той или иной функции - в результате цикл проходится быстрее. |
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
Не только, уже сказали. Для чего нужен тип string? Чтобы хранить ссылку на текстовые данные. Для чего нужен тип int? Чтобы хранить ссылку на целочисленные данные. Для чего нужен тип Delegate? Чтобы хранить ссылку на методы. Делегаты именно так и следует рассматривать - ссылка на метод. Без делегатов не обойтись нигде, где вам конкретный метод и его расположение не имеет значение (кроме сигнатура метода). Делегат описывает сигнатуру метода, то есть самую необходимую для его вызова информацию (типы параметров и возвращаемого значения). При присваивании такой переменной значения, переменная будет указывать на конкретный метод. Также, без делегатов было бы невозможно реализовать такую классную вещь, как анонимные методы или лямбда-выражения. Делегаты, вносят еще одну возможность для слабого связывания кода. Не нужно ими бредить, но и без них в одном случае вообще не обойтись, а в другом просто красивее и правильнее их использовать. ЗЫ: Я не читаю книжки по программированию, но здесь речь идет о внутренней реализации многопотчности в винде. Подробнее можно поискать в нете об этом и если что не понятно будет спросить в новой теме. За ваш поток не беспокойтесь, все ваши данные будут там в целости и сохранности, речь шла совсем о другом безобразии, которое Рихтер, надеюсь, поясняет или детализирует позже. -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| ДобренькийПапаша |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 14.1.2006 Где: г.Москва Репутация: нет Всего: 7 |
Да чего вы человеку жизнь усложняете)))
WolfTheGrey, ты глянь на методы во фреймворке, которые принимают в качестве параметра делегат и всё станет ясно. -------------------- Меня зовут Себастьян Парейра, торговец чёрным деревом. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |