C # ma do tego delegatów . Są intensywnie używane ze zdarzeniami , ponieważ zdarzenie może automatycznie wywołać pewną liczbę dołączonych delegatów (programów obsługi zdarzeń).
faktycznie zwrotna jest wskaźnik do kodu wykonywalnego, który jest przekazywany jako argument do innego kodu ... strona wymaga przeglądu
Gianluca Ghettini
8
@G_G: Nic nie mówi, że musi to być wskaźnik. Zwykle dzieje się tak, ponieważ segment danych nie jest wykonywalny, ale technicznie jest to szczegół implementacji.
Joey,
Joey: masz rację, to szczegół implementacji, ale nawet wywołanie zwrotne jest szczegółem implementacji. Możesz przepisać swój kod bez użycia jednego wywołania zwrotnego. To jest jak „podczas” kontra „za”.
Gianluca Ghettini,
1053
Właśnie cię poznałem,
I to jest szalone,
Ale oto mój numer (delegat),
Więc jeśli coś się stanie (zdarzenie)
, może zadzwoń do mnie (oddzwonienie)?
Całkowicie fajne wyjaśnienie. Skorzystam z tego wyjaśnienia za każdym razem, gdy ktoś zapyta, czy mam nadzieję, że uzyskam prawo do korzystania z niego?
Nikola Davidovic
15
+1: Uwielbiam to. To psuje piosenkę, ale powinno brzmieć: `` Ale oto mój numer i instrukcje dotyczące korzystania z określonego typu telefonu (delegata) ''
Gone Coding
8
Naucz się delegata z uśmiechem na twarzy :-)
Aakash
8
Najlepsze wyjaśnienie w historii!
zhengtonic,
3
Zwróć uwagę, że uczenie delegata innych osób z tym wyjaśnieniem działa tylko z dobrą choreografią :)
Sébastien Sevrin
87
Callback to funkcja, która zostanie wywołana, gdy proces zakończy wykonywanie określonego zadania.
Użycie wywołania zwrotnego odbywa się zwykle w logice asynchronicznej.
Aby utworzyć wywołanie zwrotne w C #, musisz przechowywać adres funkcji w zmiennej. Osiąga się to za pomocą delegatelub nowej semantyki lambda Funclub Action.
publicdelegatevoidWorkCompletedCallBack(string result);publicvoidDoWork(WorkCompletedCallBack callback){
callback("Hello world");}publicvoidTest(){WorkCompletedCallBack callback =TestCallBack;// Notice that I am referencing a method without its parameterDoWork(callback);}publicvoidTestCallBack(string result){Console.WriteLine(result);}
W dzisiejszym C # można to zrobić za pomocą lambdy:
Zwrotna jest kod wykonywalny, który jest przekazywany jako argument do innego kodu.
Realizacja
// Parent can ReadpublicclassParent{publicstringRead(){/*reads here*/};}// Child need InfopublicclassChild{privatestring information;// declare a DelegatedelegatestringGetInfo();// use an instance of the declared DelegatepublicGetInfoGetMeInformation;publicvoidObtainInfo(){// Child will use the Parent capabilities via the Delegate
information =GetMeInformation();}}
Stosowanie
ParentPeter=newParent();ChildJohny=newChild();// Tell Johny from where to obtain infoJohny.GetMeInformation=Peter.Read;Johny.ObtainInfo();// here Johny 'asks' Peter to read
cześć @serhio, dziękuję za odpowiedź. nadal jest to dla mnie trochę niejasne: gdzie dokładnie kod jest przekazywany jako argument do innego kodu. Wydaje się, że jest to dodanie metody Peter.Read do delegata dziecka?
BKSpurgeon
1
Link @serhio nie działa.
Jude
10
Funkcja zwrotna to wskaźnik funkcji, który przekazujesz do innej funkcji. Funkcja, którą wywołujesz, „oddzwoni” (wykona) inną funkcję po jej zakończeniu.
Wywołanie zwrotne można zaimplementować jako delegat metody, ale można również powiedzieć, że przekazanie obiektu, który obsługuje metodę wywołania zwrotnego w swoim interfejsie, jest wywołaniem zwrotnym.
Joe
Array.Sort (arrayObject); wywołanie obj.CompareTo (anotherObj) na elementach arrayObject jest klasycznym przykładem wywołania zwrotnego przy użyciu Interface (ICompareable) w .Net.
Ron5504
8
Jeśli odnosisz się do wywołań zwrotnych ASP.Net:
W modelu domyślnym dla stron sieci Web ASP.NET użytkownik wchodzi w interakcję ze stroną i klika przycisk lub wykonuje inną akcję, która powoduje ogłaszanie zwrotne. Strona i jej kontrolki są ponownie tworzone, kod strony jest uruchamiany na serwerze, a nowa wersja strony jest renderowana w przeglądarce. Jednak w niektórych sytuacjach przydatne jest uruchamianie kodu serwera z poziomu klienta bez wykonywania ogłaszania zwrotnego. Jeśli skrypt klienta na stronie zachowuje pewne informacje o stanie (na przykład lokalne wartości zmiennych), opublikowanie strony i pobranie jej nowej kopii niszczy ten stan. Ponadto ogłaszanie zwrotne strony wprowadza narzut przetwarzania, który może zmniejszyć wydajność i zmusić użytkownika do czekania na przetworzenie i ponowne utworzenie strony.
Aby uniknąć utraty stanu klienta i nie ponosić obciążenia związanego z przetwarzaniem w obie strony serwera, można zakodować stronę sieci Web ASP.NET tak, aby mogła wykonywać wywołania zwrotne klienta. W wywołaniu zwrotnym klienta funkcja skryptu klienta wysyła żądanie do strony sieci Web ASP.NET. Strona internetowa działa w zmodyfikowanej wersji swojego normalnego cyklu życia. Strona jest inicjowana, tworzone są jej kontrolki i inni członkowie, a następnie wywoływana jest specjalnie oznaczona metoda. Metoda wykonuje zakodowane przez użytkownika przetwarzanie, a następnie zwraca do przeglądarki wartość, którą może odczytać inna funkcja skryptu klienta. Przez cały ten proces strona jest aktywna w przeglądarce.
Wywołania zwrotne są często delegatami do metod, które są wywoływane po zakończeniu określonej operacji lub wykonaniu akcji podrzędnej. Często znajdziesz je w operacjach asynchronicznych. Jest to zasada programowania, którą można znaleźć w prawie każdym języku programowania.
classCallBackExample{publicdelegatevoidMyNumber();publicstaticvoidCallMeBack(){Console.WriteLine("He/She is calling you. Pick your phone!:)");Console.Read();}publicstaticvoidMetYourCrush(MyNumber number){int j;Console.WriteLine("is she/he interested 0/1?:");var i =Console.ReadLine();if(int.TryParse(i,out j)){var interested =(j ==0)?false:true;if(interested)//event{//call his/her number
number();}else{Console.WriteLine("Nothing happened! :(");Console.Read();}}}staticvoidMain(string[] args){MyNumber number =Program.CallMeBack;Console.WriteLine("You have just met your crush and given your number");MetYourCrush(number);Console.Read();Console.Read();}}
Objaśnienie kodu:
Stworzyłem kod, aby zaimplementować zabawne wyjaśnienie dostarczone przez LightStriker w jednej z powyższych odpowiedzi. Przekazujemy delegata (liczba) do metody ( MetYourCrush). Jeśli Zainteresowane (zdarzenie) wystąpi w method ( MetYourCrush), to wywoła delegata (numer), który trzymał odwołanie do CallMeBackmetody. Tak więc CallMeBackmetoda zostanie wywołana. Zasadniczo przekazujemy delegata do wywołania metody callback.
To nie jest wystarczającą odpowiedzią na pytanie, czy możesz wyjaśnić, co robi Twój kod, opisać, jak działa wywołanie zwrotne i jak jest zaimplementowane w C #.
Adam
Cześć Adam, Dzięki za twoją odpowiedź. Stworzyłem kod, aby zaimplementować zabawne wyjaśnienie dostarczone przez LightStriker. Przekazujemy delegata (liczba) do metody (MetYourCrush). Jeśli Zainteresowany (zdarzenie) wystąpi w metodzie (MetYourCrush), to wywoła delegata (numer), który trzymał odwołanie do metody CallMeBack. Tak więc zostanie wywołana metoda CallMeBack. Zasadniczo przekazujemy delegata do wywołania metody callback. Daj mi znać, jeśli masz jakieś pytania.
Mani
1
Prawdopodobnie nie jest to definicja słownikowa, ale wywołanie zwrotne zwykle odnosi się do funkcji, która jest zewnętrzna w stosunku do określonego obiektu, jest przechowywana, a następnie wywoływana po określonym zdarzeniu.
Przykładem może być utworzenie przycisku interfejsu użytkownika, który przechowuje odniesienie do funkcji, która wykonuje akcję. Akcja jest obsługiwana przez inną część kodu, ale po naciśnięciu przycisku wywoływana jest funkcja zwrotna, która wywołuje akcję do wykonania.
C #, zamiast używać terminu „callback” „wydarzenia” i „używa delegatów” i można dowiedzieć się więcej o delegatów tutaj .
Funkcja zwrotna umożliwia przekazanie kodu wykonywalnego jako argumentu do innego kodu. W C i C ++ jest to zaimplementowane jako wskaźnik funkcji. W .NET można użyć delegata do zarządzania wskaźnikami funkcji.
Kilka zastosowań obejmuje sygnalizację błędów i kontrolowanie, czy funkcja działa, czy nie.
1) z wywołania interfejsu użytkownika Onclient kliknij wywołanie funkcji javascript dla EX: - builpopup(p1,p2,p3...)
var finalfield = p1, p2, p3;
UseCallBack(finalfield, ""); dane z klienta przekazane do serwera przy użyciu UseCallBack
2) public void RaiseCallbackEvent(string eventArgument) W eventArgument otrzymujemy przekazane dane // wykonujemy jakąś operację po stronie serwera i przekazujemy do "callbackResult"
3) GetCallbackResult() // używając tej metody dane zostaną przekazane do klienta (funkcja ReceiveServerData ())
callbackResult
4) Pobierz dane po stronie klienta:
ReceiveServerData(text) w odpowiedzi serwera tekstowego otrzymamy.
Delegaci robią to samo, co wywołania zwrotne oparte na interfejsach w C ++ (COM ich używa), chociaż są znacznie prostsze w użyciu.
Zwróć uwagę, że Microsoft umieścił delegatów w swojej implementacji Java (J ++), ale Sun ich nie lubi [java.sun.com], więc nie spodziewaj się, że wkrótce zobaczymy ich w oficjalnej wersji Java. Zhakowałem razem preprocesor, abyś mógł używać ich w C ++, więc nie czuj się pominięty, jeśli nie programujesz w C # lub na platformie .NET (tj. W Managed C ++ lub Visual Basic.NET).
Jeśli jesteś przyzwyczajony do funkcji wskaźników w C, delegat to w zasadzie para wskaźników połączona w jeden:
Wskaźnik do obiektu (opcjonalnie)
Wskaźnik do metody tego obiektu
Oznacza to, że pojedynczy delegat przekazuje wszystkie informacje potrzebne do zlokalizowania funkcji w programie, niezależnie od tego, czy jest to metoda statyczna, czy też powiązana z obiektem.
Definiujesz je w ten sposób w C #:
publicdelegatevoidFooCallbackType(int a,int b,int c );
Chcąc z nich skorzystać, musisz usunąć delegata z funkcji, którą chcesz wywołać:
classCMyClass{publicvoidFunctionToCall(int a,int b,int c ){// This is the callback}publicvoidFoo(){FooCallbackType myDelegate =newFooCallbackType(this.FunctionToCall);// Now you can pass that to the function// that needs to call you back.}}
Jeśli chcesz, aby delegat wskazywał metodę statyczną, wygląda to tak samo:
classCMyClassWithStaticCallback{publicstaticvoidStaticFunctionToCall(int a,int b,int c ){// This is the callback}publicstaticvoidFoo(){FooCallbackType myDelegate =newFooCallbackType(CMyClass.StaticFunctionToCall);}}
Podsumowując, robią to samo, co wywołania zwrotne oparte na interfejsach w C ++, ale powodują nieco mniej problemów, ponieważ nie musisz martwić się o nazwanie swoich funkcji lub tworzenie obiektów pomocniczych, a możesz delegować dowolną metodę. Są bardziej elastyczne.
Odpowiedzi:
C # ma do tego delegatów . Są intensywnie używane ze zdarzeniami , ponieważ zdarzenie może automatycznie wywołać pewną liczbę dołączonych delegatów (programów obsługi zdarzeń).
źródło
Właśnie cię poznałem,
I to jest szalone,
Ale oto mój numer (delegat),
Więc jeśli coś się stanie (zdarzenie)
, może zadzwoń do mnie (oddzwonienie)?
źródło
Callback to funkcja, która zostanie wywołana, gdy proces zakończy wykonywanie określonego zadania.
Użycie wywołania zwrotnego odbywa się zwykle w logice asynchronicznej.
Aby utworzyć wywołanie zwrotne w C #, musisz przechowywać adres funkcji w zmiennej. Osiąga się to za pomocą
delegate
lub nowej semantyki lambdaFunc
lubAction
.W dzisiejszym C # można to zrobić za pomocą lambdy:
źródło
Definicja
Realizacja
Stosowanie
Spinki do mankietów
źródło
Funkcja zwrotna to wskaźnik funkcji, który przekazujesz do innej funkcji. Funkcja, którą wywołujesz, „oddzwoni” (wykona) inną funkcję po jej zakończeniu.
Sprawdź ten link.
źródło
Jeśli odnosisz się do wywołań zwrotnych ASP.Net:
Źródło: http://msdn.microsoft.com/en-us/library/ms178208.aspx
Jeśli odnosisz się do callbacków w kodzie:
Wywołania zwrotne są często delegatami do metod, które są wywoływane po zakończeniu określonej operacji lub wykonaniu akcji podrzędnej. Często znajdziesz je w operacjach asynchronicznych. Jest to zasada programowania, którą można znaleźć w prawie każdym języku programowania.
Więcej informacji tutaj: http://msdn.microsoft.com/en-us/library/ms173172.aspx
źródło
Dedykacja dla LightStriker:
Przykładowy kod:
Objaśnienie kodu:
Stworzyłem kod, aby zaimplementować zabawne wyjaśnienie dostarczone przez LightStriker w jednej z powyższych odpowiedzi. Przekazujemy delegata (liczba) do metody (
MetYourCrush
). Jeśli Zainteresowane (zdarzenie) wystąpi w method (MetYourCrush
), to wywoła delegata (numer), który trzymał odwołanie doCallMeBack
metody. Tak więcCallMeBack
metoda zostanie wywołana. Zasadniczo przekazujemy delegata do wywołania metody callback.Daj mi znać, jeśli masz jakieś pytania.
źródło
Prawdopodobnie nie jest to definicja słownikowa, ale wywołanie zwrotne zwykle odnosi się do funkcji, która jest zewnętrzna w stosunku do określonego obiektu, jest przechowywana, a następnie wywoływana po określonym zdarzeniu.
Przykładem może być utworzenie przycisku interfejsu użytkownika, który przechowuje odniesienie do funkcji, która wykonuje akcję. Akcja jest obsługiwana przez inną część kodu, ale po naciśnięciu przycisku wywoływana jest funkcja zwrotna, która wywołuje akcję do wykonania.
C #, zamiast używać terminu „callback” „wydarzenia” i „używa delegatów” i można dowiedzieć się więcej o delegatów tutaj .
źródło
Funkcja zwrotna umożliwia przekazanie kodu wykonywalnego jako argumentu do innego kodu. W C i C ++ jest to zaimplementowane jako wskaźnik funkcji. W .NET można użyć delegata do zarządzania wskaźnikami funkcji.
Kilka zastosowań obejmuje sygnalizację błędów i kontrolowanie, czy funkcja działa, czy nie.
Wikipedia
źródło
kroki oddzwaniania:
1) musimy zaimplementować
ICallbackEventHandler
interfejs2) Zarejestruj skrypt klienta:
1) z wywołania interfejsu użytkownika Onclient kliknij wywołanie funkcji javascript dla EX: -
builpopup(p1,p2,p3...)
var finalfield = p1, p2, p3;
UseCallBack(finalfield, "");
dane z klienta przekazane do serwera przy użyciu UseCallBack2)
public void RaiseCallbackEvent(string eventArgument)
W eventArgument otrzymujemy przekazane dane // wykonujemy jakąś operację po stronie serwera i przekazujemy do "callbackResult"3)
GetCallbackResult()
// używając tej metody dane zostaną przekazane do klienta (funkcja ReceiveServerData ())callbackResult
4) Pobierz dane po stronie klienta:
ReceiveServerData(text)
w odpowiedzi serwera tekstowego otrzymamy.źródło
Delegaci robią to samo, co wywołania zwrotne oparte na interfejsach w C ++ (COM ich używa), chociaż są znacznie prostsze w użyciu.
Zwróć uwagę, że Microsoft umieścił delegatów w swojej implementacji Java (J ++), ale Sun ich nie lubi [java.sun.com], więc nie spodziewaj się, że wkrótce zobaczymy ich w oficjalnej wersji Java. Zhakowałem razem preprocesor, abyś mógł używać ich w C ++, więc nie czuj się pominięty, jeśli nie programujesz w C # lub na platformie .NET (tj. W Managed C ++ lub Visual Basic.NET).
Jeśli jesteś przyzwyczajony do funkcji wskaźników w C, delegat to w zasadzie para wskaźników połączona w jeden:
Oznacza to, że pojedynczy delegat przekazuje wszystkie informacje potrzebne do zlokalizowania funkcji w programie, niezależnie od tego, czy jest to metoda statyczna, czy też powiązana z obiektem.
Definiujesz je w ten sposób w C #:
Chcąc z nich skorzystać, musisz usunąć delegata z funkcji, którą chcesz wywołać:
Jeśli chcesz, aby delegat wskazywał metodę statyczną, wygląda to tak samo:
Podsumowując, robią to samo, co wywołania zwrotne oparte na interfejsach w C ++, ale powodują nieco mniej problemów, ponieważ nie musisz martwić się o nazwanie swoich funkcji lub tworzenie obiektów pomocniczych, a możesz delegować dowolną metodę. Są bardziej elastyczne.
źródło