Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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);
}