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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> для чего нужны Delegate??????? 
:(
    Опции темы
WolfTheGrey
Дата 23.3.2011, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

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



Люди, пожалуйста, обьясните мне: для чего нужны Делегаты?????

Создавать и эксплуатировать их я научился, но так и не смог понять: зачем они? зачем усложнять жизнь процессору? Он и так загружен виндой smile.

Что мешает на прямую обратиться к методу и передать туда параметры? 


PM MAIL   Вверх
Экскалупатор
Дата 23.3.2011, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WolfTheGrey @  23.3.2011,  00:03 Найти цитируемый пост)
Что мешает на прямую обратиться к методу и передать туда параметры? 

а как ты предлагаешь это сделать и при этом избежать сильного связывания классов? что бы на прямую обращаться к методам другого класса, класс генерирующий событие должен знать об их существовании, а в случае делегатов он просто вызывает все что есть в делегате, и ему все равно какие классы на него подписались, класс генерирующий событие ничего про них не знает. а предположи что у тебя есть один класс генерирующий событие и десять слушающих, и что писать код для каждого слушающего класса? а если добавиться еще один тогда придется дописывать еще один вызов.
PM MAIL ICQ   Вверх
WolfTheGrey
Дата 23.3.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

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



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

public delegate void DDD(int x);
    public class myDD
    {
        public DDD myIntDDD;
        public void MuXry(int i)
        {
            Console.WriteLine(i);
        }
    }
    public class startDD
    {
        public DDD startIntDDD;
        void myMain()
        {
            myDD myyyyy = new myDD();

            // вариант первый - делегат от вызываемого класса
            myyyyy.myIntDDD = new DDD(myyyyy.MuXry);
            myyyyy.myIntDDD(10);

            //вариант второй - делегат от основного класса
            startIntDDD = new DDD(myyyyy.MuXry);
            startIntDDD(25);
        }
    }


А какой вариант по созданию делегата правильнее использовать? первый или второй
PM MAIL   Вверх
mrbrooks
Дата 23.3.2011, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

Простите - откуда такая информация?


Цитата(WolfTheGrey @  23.3.2011,  01:03 Найти цитируемый пост)
Люди, пожалуйста, обьясните мне: для чего нужны Делегаты?????

Для того же, что callback-функции. 
т.е.
Цитата

Callback (англ. call — вызов, англ. back — обратный) или фу́нкция обра́тного вы́зова в программировании — передача исполняемого кода в качестве одного из параметров другого кода. Обратный вызов позволяет в функции исполнять код, который задаётся в аргументах при её вызове. Этот код может быть определён в других контекстах программного кода и быть недоступным для прямого вызова из этой функции. Некоторые алгоритмические задачи в качестве своих входных данных имеют не только числа или объекты, но и действия (алгоритмы), которые естественным образом задаются как обратные вызовы.


делегат - тоже самое - только гламурнее.

Это сообщение отредактировал(а) mrbrooks - 23.3.2011, 10:41
PM MAIL   Вверх
WolfTheGrey
Дата 23.3.2011, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

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



Цитата
Простите - откуда такая информация?
 
Как объяснили. То есть именно этот вопрос ни где не объясняется: Для чего это создано.

Цитата
Для того же, что callback-функции. 

пожалуйста, по больше примеров (кода)

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


Я уже начал подумывать что Делегаты созданы защищать обращение к методам, как Свойства защищают обращение к переменным.

Цитата
Рихтер писал что винь такая кака, что в любой момент может прервать процесс программы, и перейти к процессу ОСи, при этом ее не волнует, что данные при передаче могут повредиться или утеряться.
 вот я и начал подумывать о том, чтоб обращение было зафиксировано, и не утеряно.

PM MAIL   Вверх
gambit
Дата 23.3.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

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



1. здесь делегат позволяет сократить код, за счет передачи метода который следует применить к коду
Код

using System; 
namespace TestDelegate 
{ 
    class Program 
    { 
        public delegate bool FindCondition<T>(T first, T second); 
  
        public static bool Max(int first, int second) 
        { 
            return first > second; 
        } 
  
        public static bool Min(int first, int second) 
        { 
            return first < second; 
        } 
  
        public static T Find<T>(T[] arr, FindCondition<T> conditionChecker) 
        { 
            T res = arr[0]; 
            for (int i = 1; i < arr.Length; i++) 
            { 
                if (conditionChecker(arr[i], res)) 
                { 
                    res = arr[i]; 
                } 
            } 
            return res; 
        } 
  
        static void Main(string[] args) 
        { 
            int[] arr = { 4, 2, 3, 8, 5, 3, 5, 3 }; 
            int res = Find<int>(arr, Max); 
  
            Console.WriteLine(res); 
            Console.ReadLine(); 
        } 
     }
}


2. Для событий. мы описываем метод который должен должен быть в классе который на этот метод подписан. И мы уверены, что если класс подписан на событие, то метод с такой сигнатурой там по любому есть и просто вызываем его. Если попытаться как то это все сделать без делегатов, то мы свалимся в огромную кучу запутанного кода и слишком сильных сильных связей - и любой пук в коде приведет к полной жопе.
PM MAIL ICQ Skype   Вверх
Экскалупатор
Дата 23.3.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

вот и с чего ты это взял? конечно нет, я просто привел пример полезности делегатов, если ты можешь в описанной мной ситуации обойтись без обратного вызова методов, то отлично.
PM MAIL ICQ   Вверх
WolfTheGrey
Дата 24.3.2011, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

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



Понятно, делегаты нудны для событий.
А как на счет многопоточности? К примеру 3 фоновый поток обращается за инфой к 6 фоновому потоку. Это тоже лучше делать через делегат?
PM MAIL   Вверх
Voyager
Дата 24.3.2011, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



WolfTheGrey, читайте специализированную литературу, больше практикуйтесь и понимание придет. Приведу аналогию: как туземцу из экваториальной Африки объяснить что такое снег в Антарктике?
PM   Вверх
Fitc
Дата 24.3.2011, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Приведу, как мне кажется, хороший пример:
Код

public class Sample
{
public Sample()
{
currentOutputKind=ToConsole;
SomeDelegateAction=OutputToConsole;
}
private currentOutputKind;
public OtputKinds CurrentOutputKind
{
get{return currentOutputKind;}
set
{
currentOutputKind=value;
switch(value)
{
case OtputKinds.ToConsole:
SomeDelegateAction=OutputToConsole;
break;
case OtputKinds.ToMessageBox:
SomeDelegateAction=OutputToMessageBox;
break;
case OtputKinds.ToConsoleAndMessageBox:
SomeDelegateAction+=OutputToMessageBox;
SomeDelegateAction+=ToConsoleAndMessageBox;
break;
}
}
}
public enum OtputKinds
{
ToConsole,
ToMessageBox,
ToConsoleAndMessageBox
}
delegate void SomeDelegate(string message);
SomeDelegate SomeDelegateAction;
public void
}
void OutputToConsole(string message)
{
Console.Writeline(message);
}
void OutputToMessageBox(string message)
{
MessageBox.Show(message);
}
public void DisplayMessage(string message)
{
SomeDelegateAction(message);
}
public void DisplayMessages(string[] messages)
{
foreach(var message in messages)
{
SomeDelegateAction(message );
}
}
}


Тут в DisplayMessages как видите в цикле не происходит каждый раз сравнение параметра currentOutputKind и в зависимости от его значения вызова той или иной функции - в результате цикл проходится быстрее.
PM MAIL   Вверх
-Mikle-
Дата 30.3.2011, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(WolfTheGrey @  24.3.2011,  05:14 Найти цитируемый пост)
Понятно, делегаты нудны для событий

Не только, уже сказали. 

Для чего нужен тип string? Чтобы хранить ссылку на текстовые данные.
Для чего нужен тип int? Чтобы хранить ссылку на целочисленные данные.
Для чего нужен тип Delegate? Чтобы хранить ссылку на методы.

Делегаты именно так и следует рассматривать - ссылка на метод. Без делегатов не обойтись нигде, где вам конкретный метод и его расположение не имеет значение (кроме сигнатура метода). Делегат описывает сигнатуру метода, то есть самую необходимую для его вызова информацию (типы параметров и возвращаемого значения). При присваивании такой переменной значения, переменная будет указывать на конкретный метод. Также, без делегатов было бы невозможно реализовать такую классную вещь, как анонимные методы или лямбда-выражения.

Делегаты, вносят еще одну возможность для слабого связывания кода. Не нужно ими бредить, но и без них в одном случае вообще не обойтись, а в другом просто красивее и правильнее их использовать.

ЗЫ:
Цитата(WolfTheGrey @  23.3.2011,  14:01 Найти цитируемый пост)
Цитата
Рихтер писал что винь такая кака, что в любой момент может прервать процесс программы, и перейти к процессу ОСи, при этом ее не волнует, что данные при передаче могут повредиться или утеряться.

 вот я и начал подумывать о том, чтоб обращение было зафиксировано, и не утеряно.

Я не читаю книжки по программированию, но здесь речь идет о внутренней реализации многопотчности в винде. Подробнее можно поискать в нете об этом и если что не понятно будет спросить в новой теме. За ваш поток не беспокойтесь, все ваши данные будут там в целости и сохранности, речь шла совсем о другом безобразии, которое Рихтер, надеюсь, поясняет или детализирует позже.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
ДобренькийПапаша
Дата 31.3.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Да чего вы человеку жизнь усложняете))) 
WolfTheGrey, ты глянь на методы во фреймворке, которые принимают в качестве параметра делегат и всё станет ясно. 


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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