Avatar billede CodingJoe Nybegynder
02. april 2011 - 18:02 Der er 11 kommentarer og
1 løsning

Eksempel på hvornår delegates er smarte at bruge....

Jeg kunne godt tænke mig endeligt, at få afdækket det smarte ved at bruge delegates.

Kan een eller anden ikke smide et eksempel ind uden brug af delegates, og herefter vise brugen af delegates, og forklare hvorfor det er smartest at bruge dem.

Jeg har sådan set konceptuelt forstået delegates, men har det svært ved at se, hvornår de kan være behændige at bruge.
Avatar billede aaberg Nybegynder
02. april 2011 - 18:43 #1
Alle events i .NET bruger delegates.
Avatar billede aaberg Nybegynder
02. april 2011 - 18:50 #2
Et andet eksempel, er hvis du laver noget kode som skal køre asynkront. Ofte vil asynkrone metoder have en callback delegate som input parameter, så tråden kan "returnere" noget.
Avatar billede Syska Mester
02. april 2011 - 18:51 #3
http://msdn.microsoft.com/en-us/library/bb397687.aspx
A lambda expression is an anonymous function that can contain expressions and statements, and can be used to create delegates or expression tree types.
Avatar billede arne_v Ekspert
02. april 2011 - 19:38 #4
Alle tilfælde hvor du vil sende en enkelt metode til noget for senere brug.
Avatar billede CodingJoe Nybegynder
03. april 2011 - 08:38 #5
Jeps, har set at events i .net typisk er delegates. Jeg savner bare eksempler på, hvornår det kan betale sig at bruge delegates.

Ved at man sender et metodekald med som parameter, men er det for at spare tid og performance eller at granulere noget kode yderligere...jeg har selv brugt delegates et par gange, men mere for øvelsens skyld. Har bare ikke set lyset med det endnu...men må nok finde et par eksempler uden delegates og med delegates for at se det smarte...
Avatar billede CodingJoe Nybegynder
03. april 2011 - 08:51 #6
http://www.dotnetperls.com/delegate

Denne artikel giver en god forklaring.
Avatar billede CodingJoe Nybegynder
03. april 2011 - 13:46 #7
Savner dog stadigvæk en slags tommelfinger regel, der indikerer at det er en god ide at bruge delegate.

Kan een herinde evt. beskrive det?
Avatar billede johny Nybegynder
03. april 2011 - 14:31 #8
@CodingJoe: Jeg forstår godt dine frustrationer, for selvom man har et værktøj, er det langt fra altid det giver mening at benytte sig af det. Jeg benytter ikke selv delegates særlig tit, da mange ting kan klares mindst lige så godt med abstract klasser og nedarvninger. Der er dog steder hvor det er nødvendig, som f.eks. hvis du skal vil pakke al fejlhåndtering ind:

private void ExecuteEncapsulated(System.Action action)
{
  try {
    action.Invoke();
  } catch (System.Exception ex) {
    DoLogging(ex);
    throw;
  }
}

private void MethodToEncapsulate()
{
  ExecuteEncapsulated(() => DoSomethingThatCanFail());
}

Ovenstående er bare et meget lille eksempel på hvad man kunne ønske at styre med omkring liggende try/catch, og den eneste måde at koden først eksekveres inde i try/catch løkken, er at sende det med som en action/delegate.

Ud over ovenstående eksempel, så har jeg kun 2 andre tidspunkter jeg bruger det:

Den ene er når jeg er for doven til at lave en klasse der kan eksekvere metoder med state, at jeg udnytter det at lambda udtryk kan refere variabler uden for udtrykket, men det er for det meste så ulæseligt at jeg altid ender med at refaktorere koden alligevel.

Det andet eksempel er, når det eksternt skal styres i hvilken rækkefølge ting skal eksekveres, hvilket f.eks. kan bruges til at gøre Silverlights asynkrone struktur synkron, ved at pakke skift mellem UI tråd og arbejder tråde ind. Den sidste her, er dog også lettere omfattende, og vil jeg ikke anbefale med mindre det er nødvendigt.
Avatar billede CodingJoe Nybegynder
03. april 2011 - 16:14 #9
Tusinde tak Johny.

Det er lige præcist problemet. Jeg har næsten aldrig haft brug for at benytte mig af delegates.

Jeg har sådan set forstået, hvad man gør, men savner værdien, der giver mig AHA oplevelsen.

Dit eksempel er tæt på det.

Smid gerne et svar ind.
Avatar billede arne_v Ekspert
03. april 2011 - 19:39 #10
Et matematisk orienteret eksempel:

using System;

namespace E
{
    public delegate double F(double x);
    public static class Integrate
    {
        private const int N = 1000;
        public static double Trapez(F f, double x1, double x2)
        {
            double d = (x2 - x1) / N;
            double res = 0;
            res += 0.5 * d * f(x1);
            for(int i = 1; i < N; i++)
            {
                res += d * f(x1 + i*d);
            }
            res += 0.5 * d * f(x2);
            return res;
        }
    }
       
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(Integrate.Trapez(x => x*x, 0, 1));
            Console.WriteLine(Integrate.Trapez(x => Math.Sin(x), 0, Math.PI));
            Console.ReadKey();
        }
    }
}
Avatar billede johny Nybegynder
03. april 2011 - 20:07 #11
Det var så lidt, og ja, AHA oplevelsen måtte jeg også lede længe efter. Men kunne forestille mig at der var flere der kunne komme med et par eksempler mere du kan bruge, inden du lukker den. Jeg kom selv på to mere jeg havde glemt i første omgang:

1) Multithreading: Hele konceptet omkring Multi threading bygger op omkring delegates, da du ikke kan sætte en tråd igang, uden at fortælle den hvad den skal udføre. Så her er delegates helt klart også nødvendigt. Hvis du vil vide mere om det, kan jeg f.eks. anbefale at læse dette indlæg om .NET 4.0 Task Parallel Library.

2) Delayed execution: Der er flere tilfælde, hvor der er kode du ønsker at eksekvere senere, som du ikke nødvendigvis har adgang til i den kontekst du er i på eksekveringstidspunktet. Det har flere brugs scenarier. Det ene kan være en måde at lave en lazy konstrutør på, hvor du ikke vil initialisere et objekt medmindre der er brug for det; eller hvis du har et framework hvor du har brug for at kunne kalde konstrutøren på objekter direkte, kan det gøres med callback's i stedet; og ja, find selv på flere, hvor det kan være brugbart at udføre noget senere.

@Arne: Er der fordele ved dit eksempel der ikke kunne være løst lige så godt, eller bedre, med et nedarvningshierarki? Det ville også give en mere genbrugelig tilgang? Eller er der fordele ved den tilgang du kommer med, som jeg misser?
Avatar billede arne_v Ekspert
03. april 2011 - 20:37 #12
Det kunne loeses daarligere ved et nedarvningshierarki.

En funktion er det begreb som findes i det man modellerer (matematikken).

At opfinde en fiktiv klasse og lave en fiktiv instans af denne for at bruge en funktion er ikke paent.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester