Autor Wątek: Delegaty.  (Przeczytany 2996 razy)

Offline BTM

  • Użytkownik

# Maj 02, 2007, 13:23:06
Witam.

Ma może ktoś pod ręką jakiś tutek / link który w przystępny sposób opiszę zasadę działania delegatów w C#?
Sure, mam książkę, która to porusza, ale z tych 300 stron, które przerobiłem do tej pory, te kilka opisujące delegaty są opisane jakby przez inną osobę, albo po paru głębszych ( "Programowanie C#" by O'RLY, tfu, O'Reilly ;] ).

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline SirMike

  • Użytkownik
    • SirMike's Techblog

# Maj 02, 2007, 15:07:26
Ma może ktoś pod ręką jakiś tutek / link który w przystępny sposób opiszę zasadę działania delegatów w C#?
Sure, mam książkę, która to porusza, ale z tych 300 stron, które przerobiłem do tej pory, te kilka opisujące delegaty są opisane jakby przez inną osobę, albo po paru głębszych ( "Programowanie C#" by O'RLY, tfu, O'Reilly ;] ).

Cos co dla jednego jest przystepne niekoniecznie bedzie przystepne dla drugiego ;)
http://www.codersource.net/csharp_delegates_events.html
http://www.google.pl/search?q=c%23+delegates

W delegatach wielkiej filozofii nie ma. To tak naprawde cos co trzyma referencje do funkcji.
Bardzo czesto wykorzystuje sie je w polaczeniu z Eventami.

Spojrz na ponizszy kod (powinien Ci sie skompilowac bez problemu):
Kod: (csharp) [Zaznacz]
using System;

public class Foo
{
    public delegate void MyHandler();
    public event MyHandler MyEvent;

    public Foo()
    {
    }

    public void MyFunction()
    {
        if(MyEvent != null)
        {
            MyEvent();
        }
    }
}

public class MyClass
{
    public static void HandlerImplementation()
    {
        Console.WriteLine("Yo!");
    }

    public static void HandlerImplementation2()
    {
        Console.WriteLine("Yo man!");
    }

    public static void Main()
    {
        Foo f = new Foo();
        f.MyEvent += new Foo.MyHandler(HandlerImplementation);
        f.MyEvent += new Foo.MyHandler(HandlerImplementation2);
        f.MyFunction();
    }
}

W klasie Foo tworzony jest delegat (czyli taka sygnatura funkcji). Tworzysz w niej takze event, ktory jest typu MyHandler (czyli stworzonego delegata). Teraz mozesz do tego eventa podpinac funkcje (mozesz uzyc operatora += i podpiac kilka funkcji do jednego eventa - zostana wywolane w kolejnosci w jakiej je podpieles). To wlasnie zrobilem w Main(), stworzylem obiekt i do jego eventa podpialem dwie funkcje. Teraz w momencie wywolania eventa (przez metode MyFunction klasy Foo) wywolywane sa takze Twoje funkcje przypisane do niego.
« Ostatnia zmiana: Maj 02, 2007, 15:09:50 wysłana przez SirMike »

Offline zarius

  • Użytkownik

# Maj 02, 2007, 16:24:34
W sumie to SirMike napisal wyszstko co potrzeba wiedziec o delegatach i eventach ;p ja moge tylko podpowiedziec jeszcze, ze istnieje mozliwosc uzywania "delegatow anonimowych"

czyli zamiast:
Kod: (csharp) [Zaznacz]
public static void HandlerImplementation() 
{       Console.WriteLine("Yo!");   }   

public static void HandlerImplementation2()   
{       Console.WriteLine("Yo man!");   }   

public static void Main()   
{       
        Foo f = new Foo();
        f.MyEvent += new Foo.MyHandler(HandlerImplementation);       
        f.MyEvent += new Foo.MyHandler(HandlerImplementation2);       
        f.MyFunction();   
}

mozna to rozwinac w miejscu mniej wiecej tak:
Kod: (csharp) [Zaznacz]
            m_Rectangle.TopChanged += delegate
            {
                m_Vertices[0].Y = m_Rectangle.Top;
                m_Vertices[1].Y = m_Rectangle.Top;
            };

gdzie, analogicznie do przykladu SirMike'a, TopChanged to event ale delegat nie jest metoda jakiejs klasy a fragmentem kodu rozwijanym w danym miejscu jak zreszta to widac wyzej :)

Pozdrawiam,
zarius
« Ostatnia zmiana: Maj 02, 2007, 16:26:24 wysłana przez zarius »