Являются ли делегаты и обратные вызовы одинаковыми или похожими? - PullRequest
48 голосов
/ 14 ноября 2008

Являются ли делегаты тем же, что и обратные вызовы? Или они как-то связаны?

Ответы [ 5 ]

31 голосов
/ 14 ноября 2008

«Обратный вызов» - это термин, который относится к шаблону проектирования кодирования, доступному на любом языке с указателями на функции, или аналогу указателям на функции (что-то вроде делегата)

В этом паттерне вы передаете указатель на функцию другой функции, чтобы внутри вызываемой функции она могла «отозвать» функцию, которую вы ей передали. Таким образом, вы можете контролировать большую часть внутреннего поведения метода извне метода, передавая указатели на разные функции «обратного вызова» каждый раз, когда вы вызываете его ... Примером обратного вызова является наличие алгоритма сортировки для этого необходимо передать указатель на функцию, которая будет «сравнивать» любую произвольную пару объектов в списке для сортировки, чтобы определить, какой из них предшествует другому. При одном вызове метода sort вы можете передать функцию обратного вызова, которая сравнивает по имени объекта, а в другой раз передать функцию, которая сравнивает по весу объекта или как угодно ...

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

Обратные вызовы также используются для реализации шаблона «наблюдатель» (реализован в .Net с использованием событий, которые сами по себе являются специальным типом делегата)

15 голосов
/ 14 ноября 2008

(я полагаю, вы говорите о .NET здесь. Если нет, уточните.)

Делегаты - это идиоматический способ реализации обратных вызовов в .NET, но это не обязательно. Вы можете использовать интерфейс, например. (В частности, у вас может быть один обратный вызов с одним методом для вызова при ошибке, а другой - в случае успеха. Конечно, вместо этого вы можете взять два делегата ...)

Существует множество вариантов использования делегатов, помимо обратных вызовов в .NET - это зависит от того, что именно вы называете обратным вызовом, но обработчики событий GUI, средства запуска потоков, фильтры и проекции (и многое другое!) В LINQ to Objects все использовать делегатов.

4 голосов
/ 14 ноября 2008

Они связаны друг с другом. Делегат - это описание того, как выглядит функция обратного вызова:

delegate void MyDelegate(string Text);

Тогда вы можете иметь функцию, которая может принимать обратный вызов в качестве параметра.

//This will result in a MessageBox with "Lalalala"
MyFunctionThatGetsTheCallbackFunctionRef(MyCallBackFunc); 

void MyFunctionThatGetsTheCallbackFunctionRef(MyDelegate TheFunction){
 TheFunction("Lalalala");
}

void MyCallBackFunc(string Text){
  //my callback
  MessageBox.Show(Text);
}
4 голосов
/ 14 ноября 2008

Как правило, делегат - это объект, используемый для доступа к методу, внешнему по отношению к объекту, которому принадлежит метод, в то время как обратный вызов - это переменная, которая содержит делегат

в C #, термины используются взаимозаменяемо

1 голос
/ 08 февраля 2019

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

Вызывающий класс устанавливает делегата для его обратного вызова.

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

...