Care sunt avantajele delegaților?

voturi
21

Care sunt beneficiile / avantajele utilizării delegaților? Poate cineva sa ofere orice exemple simple?

Întrebat 12/03/2009 la 15:04
sursa de către utilizator
În alte limbi...                            


7 răspunsuri

voturi
42

Sunt o modalitate foarte bună de încapsularea o bucată de cod. De exemplu, atunci când atașați o tratare a evenimentului la buton, care handler este un delegat. Butonul nu are nevoie să știe ce face, doar cum să-l sun la momentul potrivit.

Un alt exemplu este LINQ - filtrarea, proiecție etc toate necesită același tip de cod șablon; tot ceea ce se schimbă este logica pentru a reprezenta filtrul, proiecție etc. Cu expresii lambda în C # 3 (care sunt convertite în delegații sau copaci de expresie), acest lucru face foarte simplu:

var namesOfAdults = people.Where(person => person.Age >= 18)
                          .Select(person => person.Name);

(Acest lucru poate fi, de asemenea, reprezentat ca o expresie de interogare, dar să nu se abată prea departe de delegați.)

Un alt mod de a gândi al unui delegat este ca un tip de interfață cu o singură metodă. De exemplu, EventHandlertipul de delegat este un pic ca:

public interface IEventHandler
{
    void Invoke(object sender, EventArgs e)
}

Dar sprijinul delegat în cadrul permite delegaților să fie legat împreună, a invocat asincronă, utilizate ca manipulare eveniment etc.

Pentru mai multe detalii despre delegați și evenimente, a se vedea articolul meu pe acest subiect . Accentul este de evenimente, dar acoperă delegați prea.

Publicat 12/03/2009 la 15:07
sursa de către utilizator

voturi
2

Delegat în C # este eqv. să funcționeze pointer în C, dar ea poartă, de asemenea, o referire la instanta clasei care a fost creată din.

Toate Stivuitoare eveniment din Windows Forms sunt delegați.

Publicat 12/03/2009 la 15:10
sursa de către utilizator

voturi
2

Avantaje în comparație cu ce? Delegatii pot fi lucruri utile, și cu siguranță au locul lor într-o mulțime de cod moderat de complex C #. (De fiecare dată când utilizați evenimentele din clasele vă sunt implicit folosind delegati multicast). Dacă doriți o introducere în sintaxa și utilizările lor, recomand următoarele articole:

Publicat 12/03/2009 la 15:10
sursa de către utilizator

voturi
5

Delegații servi trei scopuri:

  1. O implementare simplificată a modelului de observare
  2. O implementare simplificată a callback
  3. Anonime (de unică folosință), blocuri de cod

Observator

public class Something
{
    public event EventHandler SomethingHappened;
}

public class SomethingConsumer
{
    private mySomething = new Something();

    public void WireUpEvents()
    {
        mySomething.SomethingHappened += whenSomethingHappened;
    }

    private void whenSoemthingHappened(object sender, EventArgs e)
    {
        // do something
    }
}

Suna inapoi

public void DoSomethingAsynchronously(EventHandler callBack)
{
    // long running logic.
    callBack(this, EventArgs.Empty);
}

Codul anonim de unică folosință

public void DoSomethingReusably(Action nonReusableCode)
{
    // reusable code
    nonReusableCode();
    // more reusable code
}

public void DoALotOfSomething()
{
    DoSomethingReusably(() => { /* non-reusable code here */ });
    DoSomethingReusably(() => { /* non-reusable code here */ });
    DoSomethingReusably(() => { /* non-reusable code here */ });
}

În toate cazurile, este doar o chestiune de a oferi conciceness.

Publicat 12/03/2009 la 15:14
sursa de către utilizator

voturi
12

Acesta este un subiect destul de vag, dar aici sunt câteva lucruri de luat în considerare -

Delegații sunt practic o, mai ușor indicator de funcție de curățare. Orice loc în care indicii funcții au fost utilizate în C ++, vă puteți gândi delegat.

Avantaje pentru utilizarea lor în design:

  • Poate duce la reutilizarea ușoară a codului
  • Poate oferi o cantitate mare de flexibilitate în modelele dvs.
  • Vă permit să dezvolte biblioteci și clase care sunt ușor extensibil, deoarece acesta oferă o modalitate ușoară de a cârlig în alte funcții (de exemplu, o în cazul în care clauza în LINQ poate utiliza un delegat [Func<T,bool>]pentru a filtra mai departe, fără a fi nevoie să scrie un nou cod în cazul în care metoda

dezavantaje potențiale:

  • Ei ~can~, mai ales dacă este folosit în mod naiv, duce la un cod care este mai dificil de citit
  • Acestea pot introduce un comportament in componenta ta, care este neașteptat, deoarece treilea cod parte din control vor primi numit (De exemplu, dacă cineva se atașează un delegat la unul dintre evenimentele dvs. care cauzează o buclă infinită, se poate face clasa ta arata rau, chiar dacă nu are nimic de-a face cu tine)
Publicat 12/03/2009 la 15:14
sursa de către utilizator

voturi
2

Disclaimer: Nu spun cum am folosit un delegat este modul intenționat, dar este un exemplu.

Am folosit doar o singură dată înainte, dar, practic, în aplicația noastră utilizatorul face clic pe un buton „complet“ pentru un pas pe care apoi le duce la o pagină de rutare pentru a decide unde să-l trimită următoare. Deci, punct de vedere tehnic pas tocmai au făcut clic pe „complet“, pe care nu este cu adevărat terminat până când aceasta ruta. Dar din moment ce eu sunt pe o altă pagină nu am avut acces ușor la cazul în care acestea au fost pur și simplu.

Deci, ce am făcut a fost creat un delegat pentru câțiva pași care necesită o procesare specială (în acest caz, un e-mail), atunci când făcut clic pe „complet“, iar când l-au direcționat pe pagina următoare mi-ar verifica existența delegatului și dacă era acolo o cheamă la foc evenimentului meu „stocat“.

Creative: probabil, greșit: poate, de lucru: definately.

Așa cum am spus, nu, probabil, modul în care a fost destinat a fi utilizat, dar de codificare este la fel de mult ca și arta drept știință?

Publicat 12/03/2009 la 15:26
sursa de către utilizator

voturi
1

Îmi amintesc un cadru Java GUI timpurie , care nu are un concept de delegați sau de rutare de comandă. Pentru a face un buton care face ceva, a trebuit să subclasa buton și suprascrie metoda clic. Ai terminat cu o mulțime și o mulțime de elemente de UI subclase cu biți mici de codul aplicației în ele.

Codul care se ocupă de acel clic trebuie să meargă undeva, și într-un limbaj OO cum ar fi Java sau C # trebuie să meargă pe o clasă, dar delegați îi permit să se întâmple pe loc convenabil. Acest lucru duce adesea la a avea prea mult cod de a face prea multe lucruri diferite, într-o clasă de formă, dar asta e o altă problemă.

Publicat 12/03/2009 la 15:37
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more