powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / делегаты в языках программирования
25 сообщений из 129, страница 2 из 6
делегаты в языках программирования
    #39058130
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВDaniilSeryiКусок кода на Хаскеле можно?
Можно, быстрая сортировка например.
Код: c#
1.
2.
 qsort []     = []
  qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)



какая гадость... Как это расшифровывается-то?
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058137
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryiЛюди, объясните нормальному человеку, выросшему на Pascale, QBasice и VBA, зачем в C-подобных языках придумали такое уродство, как делегаты?
deligate по Паскалю - это список обратных вызовов(Callback). Ключевое слово - список.
В Паскале подписаться на событие(например OnCreate) может только один подписчик, присвоив
Код: pascal
1.
2.
3.
Procedure DoFormCreate(Sender:TObject);
...
Form1.OnCreate:=DoFormCreate;


В C# подписаться на аналогичное событие может сразу несколько подписчиков. Причём выполнятся они будут последовательно.
Более того - в C# делигату можно сказать, что бы он выполнил список процедур асинхронно(.Invoke).
А в переводе на Паскаль это выглядело бы примерно так:
Код: pascal
1.
2.
3.
4.
5.
Procedure DoFormCreate(Sender:TObject);
Procedure DoFormCreate2(Sender:TObject);
...
Form1.OnCreate.Add(DoFormCreate);
Form1.OnCreate.Add(DoFormCreate2);


DaniilSeryiСмотрю на синтаксис C# - так тошно, что хочется бл%€$ть.

В принципе - ДА :)
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058143
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryiКак это расшифровывается-то?
А это не нужно расшифровывать, это изложение алгоритма практически литературным языком, в том и прелесть.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058147
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryiЕвгенийВпропущено...

Можно, быстрая сортировка например.
Код: c#
1.
2.
 qsort []     = []
  qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)



какая гадость... Как это расшифровывается-то?
Че не понятного то?
1. Для пустого писка - результат пустой список.
2. Для не пустого, склеиваем рекурсивно отсортированные все элементы меньше головы + голова + все элементы рекурсивно отсортированные больше головы.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058149
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BDaniilSeryiЛюди, объясните нормальному человеку, выросшему на Pascale, QBasice и VBA, зачем в C-подобных языках придумали такое уродство, как делегаты?
deligate по Паскалю - это список обратных вызовов(Callback). Ключевое слово - список.
В Паскале подписаться на событие(например OnCreate) может только один подписчик, присвоив
Код: pascal
1.
2.
3.
Procedure DoFormCreate(Sender:TObject);
...
Form1.OnCreate:=DoFormCreate;


В C# подписаться на аналогичное событие может сразу несколько подписчиков. Причём выполнятся они будут последовательно.
Более того - в C# делигату можно сказать, что бы он выполнил список процедур асинхронно(.Invoke).
А в переводе на Паскаль это выглядело бы примерно так:
Код: pascal
1.
2.
3.
4.
5.
Procedure DoFormCreate(Sender:TObject);
Procedure DoFormCreate2(Sender:TObject);
...
Form1.OnCreate.Add(DoFormCreate);
Form1.OnCreate.Add(DoFormCreate2);


DaniilSeryiСмотрю на синтаксис C# - так тошно, что хочется бл%€$ть.

В принципе - ДА :)
Это называется: - "найди сто ошибок в моем посте?" :)
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058198
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryskyANAпропущено...
Это называется фунции высших порядков. Да, это одно из наиболее важных применений делегатов.

В математике это называется функционалами. Ну да ладно.
Зачем нужна возможность использования функции в качестве параметров других функций мне понятно, а делегаты это что ? Более общий случай. Только не отправляйте мне ссылку на w пожалуйстаИногда функции высшего порядка называют функционалами, хотя это не совсем верно, более точный эквивалент - оператор.

Делегат задает определение функционального типа (класса) данных. Экземплярами класса являются функции. Описание делегата в языке C# представляет собой описание еще одного частного случая класса. Каждый делегат описывает множество функций с заданной сигнатурой. Каждая функция (метод), сигнатура которого совпадает с сигнатурой делегата, может рассматриваться как экземпляр класса, заданного делегатом.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058216
Adx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Adx
Гость
Все богатство LINQ и лямбда в C# в одной фразе ))
new Control[]{textbox1,button1,button2,button3}.ToList().ForEach(x=>x.Enabled = false);
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058230
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdxВсе богатство LINQ и лямбда в C# в одной фразе ))
new Control[]{textbox1,button1,button2,button3}.ToList().ForEach(x=>x.Enabled = false);Г какое-то :)
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058244
Adx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Adx
Гость
skyANAГ какое-то :)

Не без этого ;) Не все же стандартные библиотеки дублировать ;)
Ну а серьезно, в C# много классов и функций используют делегаты. Это реально удобно.
Пока не привыкнешь, конечно реакция похожая.
Но тут уж :
"Вы не любите кошек? Вы просто не умеете их готовить!" (с)
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058396
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делегаты в C# представляют собой экземпляры специального класса, который содержит в себе информацию о некотором методе и позволяет вызвать этот метод. Если быть точнее, то в общем случае на цепочку методов с определенной сигнатурой (см. Delegate и MulticastDelegate).
Компилятор знает о делегатах и предоставляет синтаксический сахар, так как механизм делегатов задействован в некоторых конструкциях языка.
1. Реализация событий.
2. Реализация функций обратного вызова, в том числе при работе с неуправляемым кодом.
3. Реализация запуска новых потоков (один из вариантов, исторически первый).
4. Асинхронный запуск функций посредством предопределенных методов Begin/EndInvoke.
5. Реализация лямбда выражений.
6. Делегаты могут быть обобщенными.
7. Начиная с 4.0 версии .NET, параметры обобщенных делегатов могут быть ко/контрвариантными.
8. Так же делегаты могут выступать параметрами и возвращаемыми значениями функций.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058398
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryiЛюди, объясните нормальному человеку, выросшему на Pascale, QBasice и VBA, зачем в C-подобных языках придумали такое уродство, как делегаты?
Затем, что сначала теоретики кричат "указатели сакс", а потом оказывается, что без них очень хреново. И начинают придумывать функторы, делегаты и всякую прочую муть, которая позволяет замаскировать понятие "указатель".
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058410
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerИ начинают придумывать функторы, делегаты и всякую прочую муть, которая позволяет замаскировать понятие "указатель".
никакой связи
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058411
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryskyANAпропущено...
Это называется фунции высших порядков. Да, это одно из наиболее важных применений делегатов.

В математике это называется функционалами. Ну да ладно.
Зачем нужна возможность использования функции в качестве параметров других функций мне понятно, а делегаты это что ? Более общий случай. Только не отправляйте мне ссылку на w пожалуйстаУказатель на метод объекта. В отличие от указателя на функцию, привязан к некоторому экземпляру объекта.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058412
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerDaniilSeryiЛюди, объясните нормальному человеку, выросшему на Pascale, QBasice и VBA, зачем в C-подобных языках придумали такое уродство, как делегаты?
Затем, что сначала теоретики кричат "указатели сакс", а потом оказывается, что без них очень хреново. И начинают придумывать функторы, делегаты и всякую прочую муть, которая позволяет замаскировать понятие "указатель".
Чушь. Просто в .NET лямбды реализуются посредством делегатов, которые в очередь можно назвать с некоторой натяжкой типизированным указателем на функцию.
в lisp или haskel отродясь никаких указателей не было, как и в JavaScript например.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058421
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneУказатель на метод объекта. В отличие от указателя на функцию, привязан к некоторому экземпляру объекта.
Приспокойно можно сделать так.
Код: c#
1.
 Func<double, double> sin = x => Math.Sin(x);


Где тут экземпляр?
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058425
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наброшу...

Многие из функций операционной системы Windows, входящие в состав Win API 32, требуют при своем вызове задания callback - функций. Примером может служить работа с объектом операционной системы Timer. Конструктор этого объекта является функцией высшего порядка, и ей в момент создания объекта необходимо в качестве параметра передать callback - функцию, вызываемую для обработки событий, которые поступают от таймера.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058431
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЧушь. Просто в .NET лямбды реализуются посредством делегатов,
Насколько я помню, делегаты в .NET появились прежде лямбд.

ЕвгенийВв lisp или haskel отродясь никаких указателей не было,
Делегатов в lisp тоже отродясь не было. Может, конечно, сейчас и добавили.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058438
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так лисповая лямбда и не делегат, она контекст захватывает. Если подыскивать аналог, это скорее анонимный класс с полями данных и одним методом.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058439
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BВ Паскале подписаться на событие(например OnCreate) может только один подписчик, присвоив
Form1.OnCreate:=DoFormCreate;

Насколько я помню, в восьмой что ли дельфе (которую делали для .NET) добавили множественную подписку. Но поскольку вещь малоактуальная, развития она не получила.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058444
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf, так я и намекаю Евгению, что он в своей риторике несколько увлёкся и побежал в сторону от делегатов.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058454
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВBarloneУказатель на метод объекта. В отличие от указателя на функцию, привязан к некоторому экземпляру объекта.
Приспокойно можно сделать так.
Код: c#
1.
 Func<double, double> sin = x => Math.Sin(x);


Где тут экземпляр?Ну хорошо. Делегат может ссылаться на метод экземпляра объекта, а может и на статический или анонимный метод. Ок?
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058491
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,
А может и как сферический конь в вакууме.
Код: c#
1.
2.
Expression<Func<string, int>> exp = s => s.Length;
            var func = exp.Compile();
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058639
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё наброшу...

Пусть F - функция высшего порядка с параметром G функционального типа. Тогда функцию G , задающую параметр (а иногда и саму функцию F ), называют функцией обратного вызова ( callback функцией).
Термин вполне понятен. Если в некотором внешнем слое функция Q вызывает функцию внутреннего слоя F , то предварительно во внешнем слое следует позаботиться о создании функции G , которая и будет передана F .
Таким образом, функция Q внешнего слоя вызывает функцию F внутреннего слоя, которая, в свою очередь (обратный вызов) вызывает функцию G внешнего слоя. Чтобы эта техника работала, должен быть задан контракт.
Функция высших порядков, написанная во внутреннем слое, задает следующий контракт: "всякая функция, которая собирается меня вызвать, должна передать мне функцию обратного вызова,
принадлежащую определенному мной функциональному классу, следовательно, иметь известную мне сигнатуру".
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058660
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058947
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЕщё наброшу...

Пусть F - функция высшего порядка с параметром G функционального типа. Тогда функцию G , задающую параметр (а иногда и саму функцию F ), называют функцией обратного вызова ( callback функцией).
Термин вполне понятен. Если в некотором внешнем слое функция Q вызывает функцию внутреннего слоя F , то предварительно во внешнем слое следует позаботиться о создании функции G , которая и будет передана F .
Таким образом, функция Q внешнего слоя вызывает функцию F внутреннего слоя, которая, в свою очередь (обратный вызов) вызывает функцию G внешнего слоя. Чтобы эта техника работала, должен быть задан контракт.
Функция высших порядков, написанная во внутреннем слое, задает следующий контракт: "всякая функция, которая собирается меня вызвать, должна передать мне функцию обратного вызова,
принадлежащую определенному мной функциональному классу, следовательно, иметь известную мне сигнатуру".

Это в целом понятно, спасибо. Не могли бы вы привести пример, на котором было бы видно чёткую разницу между слоями, пожалуйста
...
Рейтинг: 0 / 0
25 сообщений из 129, страница 2 из 6
Форумы / Программирование [игнор отключен] [закрыт для гостей] / делегаты в языках программирования
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]