Warsztat » Forum

[C#] Delegaty.

Apr 21, 2009 | BTM |
3 wypowiedzi na 1 stronach:
1
BTM
Apr 21, 2009

Delegaty.

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 ;] ).
SirMike
Apr 23, 2009

Odp: Delegaty.

Cytat:

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]
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.
zarius
Apr 22, 2009

Odp: Delegaty.

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]
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]
            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
Strony:
1