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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Делегаты, На пальцах обьясните... 
:(
    Опции темы
Coocky
Дата 1.4.2005, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Вот начали изучать шарпак.Пару уроков прогулял...
Взял в электронке у одногрупников.А там делегаты описываются и задание нужно сделатьНо так хреново описываются...Обьясните на пальцах.Вроде как понял ,что это "крутой" указатель на функцию.?
З.Ы.Тоьлко плиз без умничества и споров.Просто на пальцах...


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Дрон
Дата 2.4.2005, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 24
Всего: 93



Coocky
Попробую на пальцах объяснить smile

Это не совсем указатель. Это тип указателя.
Объявление
Код
delegate void fType(int param);

примерно похоже на объявление в С++ (в VC++ 6.0 не прокатит)
Код
typedef void (*fType)(int param)


Дальше, пусть у нас есть такой код:
Код
void myFunction(int p)
{
     return;
}


Тогда указатель на неё будет определяться так:
Код
fType ptr = new fType(myFunction);


Но! Есть важная разница.
Делегат хранит в себе информацию о том, к какому объекту (именно объекту) принадлежит метод.
Т.е. в нём также сохраняется ещё и указатель на объект. И при вызове через делегат именно этот объект передаётся в качестве this. Естественно, для статических методов он ничего не передаёт smile
Например:
Код
class myClass
{
  public int val;
  public void myFunction(int p)
  {
       val = p;
  }
}

И где-то есть такой код
Код

myClass obj1 = new myClass();
myClass obj2 = new myClass();
fType p1 = new fType(obj1->myFunction);
fType p2 = new fType(obj2->myFunction);
p1(1);
p2(2);
System.Console.WriteLine(obj1.val.ToString());
System.Console.WriteLine(obj2.val.ToString());

Выведет строки с числами 1 и 2.

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

fType p3 = p1 + p2;
p3(5); // вызовет методы для обоих объектов
p3 -= p1;
p3(7); // вызовет только для второго



--------------------
Да. Именно так.
PM   Вверх
Domestic Cat
Дата 2.4.2005, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



[offtop]
Coocky, я понимаю конечно, но ведь необязательно учить все по лекциям... Есть книжки... Если проработаь одну книжку, начнешь гораздо лучше все понимать...
[/offtop]


--------------------

PM   Вверх
Gazon
Дата 2.4.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



--------------------
Чем больше узнаешь, тем больше не знаешь, но до истины всегда можно добраться.
PM MAIL   Вверх
Coocky
Дата 4.4.2005, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Спасибо всем!Извините что гружу ламерскими вопросами,но такие обстоятелства smile Нетерпеливый я ...А вот с книжками проблемы.Почему-то ну ОЧЕНЬ дорого стоят.Спасибо за сылку.
Но еще буду вас мучать smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
neutrino
Дата 6.4.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Делегаты прекрасно можно изучить по МСДН.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
lioness
Дата 22.8.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И вот мне кто-нибудь бы в двух словах объяснил, в чем СМАК делегатов???????  Вот пример из MSDN
Код

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp_SamplesDelegates
{
public class SamplesDelegate  {

   // Declares a delegate for a method that takes in an int and returns a String.
   public delegate String myMethodDelegate( int myInt );

   // Defines some methods to which the delegate can point.
   public class mySampleClass  {

      // Defines an instance method.
      public String myStringMethod ( int myInt )  {
         if ( myInt > 0 )
            return( "positive" );
         if ( myInt < 0 )
            return( "negative" );
         return ( "zero" );
      }

      // Defines a static method.
      public static String mySignMethod ( int myInt )  {
         if ( myInt > 0 )
            return( "+" );
         if ( myInt < 0 )
            return( "-" );
         return ( "" );
      }
   }

   public static void Main()  {

      // Creates one delegate for each method.
      mySampleClass mySC = new mySampleClass();
      myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );
      myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod );
 
      // Invokes the delegates.
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
      Console.WriteLine("This sample this methods");

      Console.WriteLine("{0} is {1}; use the sign \"{2}\".", -7, mySC.myStringMethod(-7), mySampleClass.mySignMethod(-7));
      Console.ReadLine();
   }

}

}



Я добавила еще одну строку - вот эту 
Код

 Console.WriteLine("{0} is {1}; use the sign \"{2}\".", -7, mySC.myStringMethod(-7), mySampleClass.mySignMethod(-7));


Ну так в чем необыкновенность первых трех строк, using делегатов, если я могу, НА МОЙ ВЗГЛЯД, так же использовать совершенно обычные методы.  smile 
PM MAIL   Вверх
mr.DUDA
Дата 22.8.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(lioness @  22.8.2006,  11:39 Найти цитируемый пост)
Ну так в чем необыкновенность первых трех строк, using делегатов, если я могу, НА МОЙ ВЗГЛЯД, так же использовать совершенно обычные методы.  

Примеры:

1) Есть класс с методом, который предоставляет частичную функциональность. Сам метод реализует только наиболее общую часть логики, остальное должен выполнить пользователь данного метода. Живой пример - Array.ForEach, Array.ConvertAll и т.п.
2) Объект А хочет, чтобы окружающие объекты могли реагировать на изменения состояния объекта А. Для этого можно выставить наружу переменную с типом делегата, тогда любой желающий может добавить свой метод в список вызова делегата (Delegate.Combine), а объекту А останется только вызывать подписчик(и) делегата с пом. Invoke. Кстати, так работают события.

Вообще, спор о том для чего годятся и не годятся делегаты, шёл одно время в разделе Java vs. NET в форуме по Java. Выяснили, что вместо делегата можно использовать виртуальный метод, объявленный в базовом классе, и реализованный в производном классе. Также выяснили, что статические методы вызывать таким способом нельзя (а с пом. делегатов можно вызвать как статический, так и нестатический метод). Окончательно решили, что делегат - всего лишь синтаксический сахар, позволяющий сократить количество строк кода, отводимых на классы с реализацией виртуальных методов.



--------------------
user posted image
PM MAIL WWW   Вверх
EvgenZ
Дата 9.5.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



C Праздником!

Подскажите пожалуйста, а зачем вообще нужны делегаты, как я понял события это тоже самое, что и делегаты, только удобнее или я не прав?


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
ivashkanet
Дата 10.5.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 47
Всего: 149



Цитата(EvgenZ @  9.5.2007,  12:36 Найти цитируемый пост)
Подскажите пожалуйста, а зачем вообще нужны делегаты, как я понял события это тоже самое, что и делегаты, только удобнее или я не прав? 

Нет, нет и нет smile 
Евенты реализуются через делегаты. Т.е. евенты это только часть того, что можно сделать с помощью делегатов.

Вот второй вариант использования:
Цитата(mr.DUDA @  22.8.2006,  11:51 Найти цитируемый пост)
1) Есть класс с методом, который предоставляет частичную функциональность. Сам метод реализует только наиболее общую часть логики, остальное должен выполнить пользователь данного метода. Живой пример - Array.ForEach, Array.ConvertAll и т.п.



Это сообщение отредактировал(а) ivashkanet - 10.5.2007, 08:59
PM MAIL WWW ICQ   Вверх
tol05
Дата 10.5.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 63
Всего: 170



Добавлю к сказанному 
ivashkanet, если он не против smile

Евенты - это оболочка над делегатами они просто инкапсулируют в себе некоторые дополнительные методы и свойства, которые позволяют работать с делегатами с меньшим числом ошибок. Например, они реализуют методы Add() и Remove() для регистрации методов делегата, поле, которое содержит сам делегат.
Как пишет товарищ Троелсен, евенты "это синтаксическая конфетка для удобства написания кода". Если MSIL посмотреть, то увидим только делегаты и ничего больше. 
Когда-то я написал простую программу на событиях, потом переписал ее с помощью одних только делегатов. И код получился проще (интуитивно понятным) и работала она быстрее.
Любил спорить, что делегаты круче чем евенты smile
А потом почитал паттерны и все понял. Паттерн наблюдатель, по-моему - это делегат, а событие расширяет его как паттерн команда.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ivashkanet
Дата 10.5.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 47
Всего: 149



Цитата(tol05 @  10.5.2007,  08:22 Найти цитируемый пост)
Паттерн наблюдатель, по-моему - это делегат, а событие расширяет его как паттерн команда. 

Не хочу холиварить ( smile ), но эвент и есть реализация Наблюдателя:


Код 
Код
someObject.SomeEvent+= new SomeDelegate(SomeMethod);
Равносилен, как сказал tol05, следующему:
Код
someObject.SomeEvent = Delegate.Combine(someObject.SomeEvent, new SomeDelegate(SomeMethod));
// боже упаси написать такой код самому (я про нарушение инкапсуляции при раскрытии того, как работает someObject.SomeEvent)

После этой строчки, в коллекцию делегатов (someObject.SomeEvent) добавится новый делегат на наш метод (new SomeDelegate(SomeMethod))

Далее, когда мы выкидываем этот эвент, мы, по сути, запускаем по очереди каждый метод (представленный делегатом) в коллекции делегатов:
Код

SomeEvent("Поехали"); // мой SomeDelegate принимает параметр string


Таким образом, наш класс добавляет наблюдателя new SomeDelegate(SomeMethod) к объекту someObject на действие SomeEvent


Это сообщение отредактировал(а) ivashkanet - 10.5.2007, 09:51
PM MAIL WWW ICQ   Вверх
EvgenZ
Дата 10.5.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Не грамотно просто сформулировал... извиняюсь.
Зачем писать кучу кода, когда можно обойтись event'ами, ведь компилятор сам создаст необходимые, шаблонные, методы и все равно потом все переведет в один и тот же CIL код.  smile

Добавлено через 2 минуты и 26 секунд
Или это просто устаревшая запись оставленная для совместимости?


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
ivashkanet
Дата 10.5.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 47
Всего: 149



EvgenZ, в каком месте обойтись?
Как мне поможет Эвент при кастомной сортировке массива:
Код
myArray.Sort(myComparerDelegate);

Пример притянут за уши (ибо в этом случае лучше использовать класс с интерфейсом IComparer), но суть проясняет.


Повторюсь: эвенты, это только вершина айсберга применения делегатов!
PM MAIL WWW ICQ   Вверх
EvgenZ
Дата 10.5.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Всем спасибо, не совсем понял, думаю понимание придет с ковырянием конкретной задачи.  smile 


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
mr.DUDA
Дата 10.5.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



EvgenZ, понимание придёт с решением простой задачи "как создать класс с событием и класс(ы) с обработчиками этого события; как связать обработчики с событием и как сгенерировать событие" smile

Ну или такой задачи (без событий): "как создать метод, принимающий в числе входных параметров делегат на другой метод, используемый как callback; как вызвать callback".

З.Ы. третья задача, которую любят на сертификационном экзамене M$ - как вызвать метод в отдельном потоке (точнее в пуле потоков) используя делегат на метод; и как правильно дождаться завершения выполнения асинхронного метода.


--------------------
user posted image
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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