![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
Вот начали изучать шарпак.Пару уроков прогулял...
Взял в электронке у одногрупников.А там делегаты описываются и задание нужно сделатьНо так хреново описываются...Обьясните на пальцах.Вроде как понял ,что это "крутой" указатель на функцию.? З.Ы.Тоьлко плиз без умничества и споров.Просто на пальцах... -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Дрон |
|
||||||||||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Coocky
Попробую на пальцах объяснить Это не совсем указатель. Это тип указателя. Объявление
примерно похоже на объявление в С++ (в VC++ 6.0 не прокатит)
Дальше, пусть у нас есть такой код:
Тогда указатель на неё будет определяться так:
Но! Есть важная разница. Делегат хранит в себе информацию о том, к какому объекту (именно объекту) принадлежит метод. Т.е. в нём также сохраняется ещё и указатель на объект. И при вызове через делегат именно этот объект передаётся в качестве this. Естественно, для статических методов он ничего не передаёт Например:
И где-то есть такой код
Выведет строки с числами 1 и 2. Кроме того в делегаты можно объединять. Т.е. им можно будет сразу вызывать много функций. Для объединения служит оператор + (для удаления соответственно -).
-------------------- Да. Именно так. |
||||||||||||||
|
|||||||||||||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
[offtop]
Coocky, я понимаю конечно, но ведь необязательно учить все по лекциям... Есть книжки... Если проработаь одну книжку, начнешь гораздо лучше все понимать... [/offtop] -------------------- |
|||
|
||||
| Gazon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 9.1.2005 Репутация: 3 Всего: 8 |
http://www.electronick.org.ua/articles/183/
http://www.buildercpp.net.ru/phpBB2/portal...clessharp&id=30 http://dotsite.ru/Tutorials/CSharp/ --------------------
Чем больше узнаешь, тем больше не знаешь, но до истины всегда можно добраться. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
Спасибо всем!Извините что гружу ламерскими вопросами,но такие обстоятелства
Но еще буду вас мучать -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Делегаты прекрасно можно изучить по МСДН.
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
| lioness |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 27.7.2006 Репутация: нет Всего: нет |
И вот мне кто-нибудь бы в двух словах объяснил, в чем СМАК делегатов??????? Вот пример из MSDN
Я добавила еще одну строку - вот эту
Ну так в чем необыкновенность первых трех строк, using делегатов, если я могу, НА МОЙ ВЗГЛЯД, так же использовать совершенно обычные методы. |
||||
|
|||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Примеры: 1) Есть класс с методом, который предоставляет частичную функциональность. Сам метод реализует только наиболее общую часть логики, остальное должен выполнить пользователь данного метода. Живой пример - Array.ForEach, Array.ConvertAll и т.п. 2) Объект А хочет, чтобы окружающие объекты могли реагировать на изменения состояния объекта А. Для этого можно выставить наружу переменную с типом делегата, тогда любой желающий может добавить свой метод в список вызова делегата (Delegate.Combine), а объекту А останется только вызывать подписчик(и) делегата с пом. Invoke. Кстати, так работают события. Вообще, спор о том для чего годятся и не годятся делегаты, шёл одно время в разделе Java vs. NET в форуме по Java. Выяснили, что вместо делегата можно использовать виртуальный метод, объявленный в базовом классе, и реализованный в производном классе. Также выяснили, что статические методы вызывать таким способом нельзя (а с пом. делегатов можно вызвать как статический, так и нестатический метод). Окончательно решили, что делегат - всего лишь синтаксический сахар, позволяющий сократить количество строк кода, отводимых на классы с реализацией виртуальных методов. -------------------- ![]() |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: нет Всего: 11 |
C Праздником!
Подскажите пожалуйста, а зачем вообще нужны делегаты, как я понял события это тоже самое, что и делегаты, только удобнее или я не прав? -------------------- <удалено администрацией форума> |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Нет, нет и нет Евенты реализуются через делегаты. Т.е. евенты это только часть того, что можно сделать с помощью делегатов. Вот второй вариант использования: Это сообщение отредактировал(а) ivashkanet - 10.5.2007, 08:59 |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Добавлю к сказанному
ivashkanet, если он не против Евенты - это оболочка над делегатами они просто инкапсулируют в себе некоторые дополнительные методы и свойства, которые позволяют работать с делегатами с меньшим числом ошибок. Например, они реализуют методы Add() и Remove() для регистрации методов делегата, поле, которое содержит сам делегат. Как пишет товарищ Троелсен, евенты "это синтаксическая конфетка для удобства написания кода". Если MSIL посмотреть, то увидим только делегаты и ничего больше. Когда-то я написал простую программу на событиях, потом переписал ее с помощью одних только делегатов. И код получился проще (интуитивно понятным) и работала она быстрее. Любил спорить, что делегаты круче чем евенты А потом почитал паттерны и все понял. Паттерн наблюдатель, по-моему - это делегат, а событие расширяет его как паттерн команда. -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| ivashkanet |
|
||||||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Не хочу холиварить ( Код
После этой строчки, в коллекцию делегатов (someObject.SomeEvent) добавится новый делегат на наш метод (new SomeDelegate(SomeMethod)) Далее, когда мы выкидываем этот эвент, мы, по сути, запускаем по очереди каждый метод (представленный делегатом) в коллекции делегатов:
Таким образом, наш класс добавляет наблюдателя new SomeDelegate(SomeMethod) к объекту someObject на действие SomeEvent Это сообщение отредактировал(а) ivashkanet - 10.5.2007, 09:51 |
||||||||
|
|||||||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: нет Всего: 11 |
Не грамотно просто сформулировал... извиняюсь.
Зачем писать кучу кода, когда можно обойтись event'ами, ведь компилятор сам создаст необходимые, шаблонные, методы и все равно потом все переведет в один и тот же CIL код. Добавлено через 2 минуты и 26 секунд Или это просто устаревшая запись оставленная для совместимости? -------------------- <удалено администрацией форума> |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
EvgenZ, в каком месте обойтись?
Как мне поможет Эвент при кастомной сортировке массива:
Пример притянут за уши (ибо в этом случае лучше использовать класс с интерфейсом IComparer), но суть проясняет. Повторюсь: эвенты, это только вершина айсберга применения делегатов! |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: нет Всего: 11 |
Всем спасибо, не совсем понял, думаю понимание придет с ковырянием конкретной задачи.
-------------------- <удалено администрацией форума> |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [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. |