C# Delegates Verständnis

TheRepatriate

Lt. Junior Grade
Registriert
Nov. 2008
Beiträge
258
Hallo zusammen,

ich habe vor kurzem angefangen in C# zu programmieren und bin beim Konzept der Delegates stehengeblieben.
Grundsätzlich verstehe ich ja, dass ein Delegate eine Objekt ist, welches in erster Linie eine Methode (oder auch mehrere) referenziert, bzw. auf eine Methode zeigt.
Nun erschließt sich mir bei den bisherigen Beispielen nicht so ganz der Sinn dabei. Worin liegt der Vorteil ein Delegate zu benutzen anstatt direkt die referenzierte Methode aufzurufen?
Das wurde in den Beispielen die ich bis jetzt im Internet gefunden habe noch nicht klar und scheinbar habe ich etwas elementares noch nicht verstanden!

Hoffe mir kann jemand weiterhelfen, danke im Voraus!
 
nein, außer in C# habe ich bis jetzt nur in Java programmiert, und da jetzt auch nicht professionell
 
Für mich persönlich erschließt sich die Daseinsberechtigung von Delegates am besten bei den Ereignissen:
Im Delegate können beliebig viele Methodenzeiger "gespeichert" werden
Das Delegate kann jeder Zeit aufgerufen werden
Parameter werden von dem Member festgelegt, welcher das Delegate befüllt, nicht von dem, der es Aufruft
(Zustände könnten ja verschieden sein)

Ohne die Zeiger, könnte man nur seeehr begrenzt Events ausführen. Und zwar nur in einem linearen ablauf, wodurch Events keinen Sinn mehr hätten.
Bei komplexeren Programmstrukturen, etwa auch beim Multithreading, werden die Delegates eigentlich von selbst verständlich.

edit: Ich könnte auch noch meine lieblings-C#-Lektüre empfehlen:
http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_05_001.htm

MfG
Damon
 
Zuletzt bearbeitet:
Lies dir am besten mal diese 2 Seiten durch:
Delegat (C#-Referenz)
Delegaten (C#-Programmierhandbuch)

Generell sind Events (fallst du weißt was das ist) auch nur Delegaten.
Außerdem kann man per Delegat einer Methode eine andere Methode als Parameter übergeben, was z.B. bei Listen nützlich sein kann, die man dadurch nach bestimmten Kriterien filtern kann.

Ich hab dir mal ein kleines Beispiel dazu geschrieben:
Code:
    class Program
    {
        static void Main(string[] args)
        {
            //Generische Liste
            List<Chick> chicks = new List<Chick>();

            chicks.Add(new Chick("Mandy", false));
            chicks.Add(new Chick("Lena", true));
            chicks.Add(new Chick("Steffi", true));
            chicks.Add(new Chick("Horst", false));
            chicks.Add(new Chick("Julia", true));

            //Generischer Delegat
            Func<Chick, bool> isHot = new Func<Chick, bool>(IsChickHot);

            //Hier wird der Delegat "isHot" der Methode "Where" übergeben.
            //Die Methode "Where" kann dann die Methode "IsChickHot" aufrufen,
            //auf die der Delegat "isHot" zeigt.
            //Mithilfe dieser Methode kann dann geprüft werden, ob das Huhn heiß ist oder nicht.
            //Die Methode gibt dann nur die Hühner zurück die heiß sind,
            //weil kalte Hühner schmecken nicht gut. ;)
            //Das Ergebnis wird dann wieder in eine Liste konvertiert. (ToList())
            List<Chick> tastyChicks = chicks.Where(isHot).ToList();


            //Ausgabe
            Console.WriteLine("Tasty chicks:");

            foreach (Chick c in tastyChicks)
            {
                Console.WriteLine(c.Name);
            }

            Console.WriteLine("\n\nPress any key to exit.");
            Console.ReadKey();
        }

        static bool IsChickHot(Chick chick)
        {
            return chick.IsHot;
        }

        public class Chick
        {
            //Automatisch implementierte Eigenschaften
            public bool IsHot { get; set; }
            public string Name { get; set; }
            
            public Chick(string name, bool isHot)
            {
                this.Name = name;
                this.IsHot = isHot;
            }
        }
    }
Die Kommentare sollten eigentlich alles ganz gut erklären.
Ich hab bei ein paar Sachen die du evtl. noch nicht kennst auch noch dazu geschrieben, wonach du suchen musst (am besten im MSDN).

Ich hoffe das hilft dir ;)


PS: Das Filtern von Listen geht natürlich noch kürzer und schöner.
Entweder per Anonymer Methode, oder noch besser per Lambda Expression.
Da wirst du aber dann wohl eh irgendwann selbst drauf stoßen.
 
Code:
chicks.Add(new[COLOR="Red"] Chick("Horst"[/COLOR], false));

Spätestens hier sollte es eine IieeePfui-Exception geben. :p
 
Zurück
Oben