Delegaty - praktyczne zastosowanie, jakie problemy się za ich pomocą rozwiązuje?

0

Cześć,
Poznaję właśnie delegaty i chciałbym się dowiedzieć w jakich sytuacjach są najczęściej stosowane. Kiedy wy je stosujecie, przy jakiego typu problemach są bardzo pomocne?
Macie może jakieś fajne źródła, gdzie w pełni, na praktycznym przykładzie są pokazane możliwości jakie oferują delegaty?
Ja niestety znajduję objaśnienia z bardzo naciąganymi przykładami, które nie mają sensu.
Na przykład ten post wprowadza przykłady, które pokazują, jak one działają, ale większego sensu tu nie ma.

Pozdrawiam i wielki dzięki za wszelkie pomoce!

0

poczytaj ogólnei o wskaźnikach do funkcji w innych językach i o callbackach

2

Chyba najczęściej wykorzystywane delegaty to Eventy i EventHandlers. Wydaje mi się, że ten przykład dobrze pokazuje zastosowanie delegatów, gdzie w klasie Counter jest tworzony Event ThresholdReached, a klasa Program subskrybuje do tego eventu handler c_ThresholdReached. Tak więc jeśli nastąpi ThresholdReached to odpala się c_ThresholdReached. Też w klasie Counter masz do Eventu dołączone argumenty ThresholdReachedEventArgs : Threshold i TimeReached.

Proponuję potworzyć swoje żeby ogarnąć jak to działa.

EventHandlers są też wykorzystywane w MVVM do komunikacji między modelami widoków.

Masz też wiele wbudowanych już eventów, na przykład Window.Closed, ktory się aktywuje przy zamknięciu okna w System.Windows, można doń podpiąć handler, np:

Window win = new Window();
win.Closed += SomethingHappensEventHandler;
3

e.g gdy chcesz przekazać funkcję jako parametr funkcji.

0

Przykład praktyczny - generyczny parser pliku csv. W samym parserze definiujesz logikę obslugi pliku i pobierania z niego danych (np wiersz po wierszu), cięcia na odpowiednie fragmenty. Jako jeden z parametrów wejsciowych funkcji przyjmujesz np Func<string[],T>.
W takiej sytuacji parser obsluguje kazdy przypadek uzycia poniewaz zapewnia tylko ogolny zestaw operacji potrzebnych do wyciagniecia zestawu danych. Samą logikę mapowania przekazujesz z miejsca wywolania tego parsera.

0
public class MyClass
{
    public MyClass(OperationDelegate Operation)
    {
        this.Operation = Operation;
    }
    public delegate double OperationDelegate(double[] Args);

    private OperationDelegate Operation;

    public double DoOperation(double[] Args)
    {
        return Operation(Args);
    }

    public static void Example()
    {
        // Dodawanie
        MyClass c1 = new MyClass((double[] Args) =>
        {
            double result = 0;
            foreach (double arg in Args)
                result += arg;
            return result;
        });
        //Odejmowanie
        MyClass c2 = new MyClass((double[] Args) =>
        {
            double result = 0;
            foreach (double arg in Args)
                result -= arg;
            return result;
        });

        Console.WriteLine(c1.DoOperation(new double[] { 5, 23, 124, 2 })); // Wykona dodawanie
        Console.WriteLine(c2.DoOperation(new double[] { 5, 23, 124, 2 })); // Wykona odejmowanie liczb od wartości 0
    }
}
0

Historycznie jest na odwrót, ale delegaty mozesz traktować jako swego rodzaju sline typowanie dla fukcji anonimowych. Pozalaja zachowac jednolitosc i sa duzo bardziej czytelne niz ´Action<object,EventsArgs>´.

To tyle co musisz wiedziec. Jesli chcesz zglebic temat poczytaj o fukcjach anonimowych, lamdach i domknieciach, same delgaty i traktuj jako uposledzonych braci tych pierwszych

Ed. To ze graja role uposledzonych braci powoduje ze nie ma na ich temat za wiele w necie. No bo po co?:p

0

Delegaty to w c# najprostsza implementacja wzorca Strategia https://pl.wikipedia.org/wiki/Strategia_(wzorzec_projektowy) bez implementowania całej klasy bezpośrednio - użyte zmienne automatycznie pakują się w closure, a wywoływana metoda staje się anonimowa bez nazwy.

To jest jeszcze do zaakceptowania chociaż czytelność kodu względem osobnej klasy zazwyczaj spada - zwłaszcza, że często niestety widuje się przekazywanie więcej niż jednego delegate.
Mniej więcej podobnie jak często zamiast klas, duża rzesza "programistów" postanawia używać nagminne słowników string -> object. Właściwie używając Tuple, Dictionary i delegatów można w ogóle pozbyć się jawnie deklarowanych klas. Polecam

0

Np. w graficznym interfejsie użytkownika GUI

1
obscurity napisał(a):

Delegaty to w c# najprostsza implementacja wzorca Strategia https://pl.wikipedia.org/wiki/Strategia_(wzorzec_projektowy) bez implementowania całej klasy bezpośrednio - użyte zmienne automatycznie pakują się w closure, a wywoływana metoda staje się anonimowa bez nazwy.

Metoda nie staje się anonimowa. w delegacie możesz trzymać dowolną metode i nic poza wywołaniem podczas wywołania sie nie dzieje. Funkcje anonimowe to takie które delklarujesz bez podawania nazwy, a nie te co trzymasz w delegatach. Użyte zmienne nie pakują się automaczynie w clousure(domkniecie).
Przez domkniecie przekazywane są przekazywane uzyte zmienne z wyszego scopa. Zmienne uzyte jako parametry nie są przekazywane przez domkniecie. Jeśli nie używałeś zmiennych z wyższego scopa, clousure nie zostanie utworzone, w cale. Robi to róznice przy porównywaniu delegat, i odpinaniu eventów. Jeśli fukncja anonimowa nie korzysta z domkniecia, wtedy w jej miejsce tworzona jest tworzona i uzywana fukcja statyczna. Zawsze ta sama, wiec można ją skutecznie porównywać z innymi i odpinać od eventu. Fukncje nie anonimowe również można odpiąć i porównywać nawet jeśli żagluje się nimi w delegatach. Natomiast fukcje anonimowe kozystające z closure zawsze będą różne przy porównaniu, dlatego nie da się ich odpiąć z eventów :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1