lørdag den 18. maj 2013

Delegates


Brugen af hændelser eller Events i C# er en vigtig del af brugerfladeprogrammering. Hændelser giver en klasse mulighed for at kommunikere med andre objekter. Dette betyder at hændelser kan reagere på en handling i brugergrænsefladen, det kan f.eks være tryk på en knap, markering af en checkbox etc.

Grundlaget for hændelser er de såkaldte delegates. Delegates er referncevariabler der gør det mulighed at at kalde en metode uden at definere hvilken metode der kaldes før i afviklingsøjeblikket. En delegate anvender keywordet delegate. En delegate skal have samme signatur som den metode den skal bruges til at kalde. Det vil sige samme returtype og samme antal og type argumenter.

Nedenstående eksempel viser en delegate i funktion.

    // Delegaten defineres
    public delegate void VelkomstDelegate(string navn);

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Indtast navn");
            string navn = Console.ReadLine();

            Console.WriteLine("Indtast sprog");
            string sprog = Console.ReadLine();         

            if (sprog == "tysk")
            {
                // Der laves et objekt af delegaten VelkomstDelegate, metoden bruges som argument her Velkomst.tysk
                VelkomstDelegate Dele = new VelkomstDelegate(Velkomst.tysk);

                // Delegaten bruges nu som metoden Velkomst.tysk ville være brugt
                Dele(navn);
            }
            else
            {
                // Der laves et objekt af delegaten VelkomstDelegate, metoden bruges som argument her Velkomst.engelsk
                VelkomstDelegate Dele = new VelkomstDelegate(Velkomst.engelsk);

                // Delegaten bruges nu som metoden Velkomst.engelsk ville være brugt
                Dele(navn);
            }
            Console.ReadKey();
        }
    }

    public class Velkomst
    {
        public static void tysk(string navn)
        {
            Console.WriteLine("Wilkommen {0}", navn);
        }
        public static void engelsk(string navn)
        {
            Console.WriteLine("Welcome {0}", navn);
        }
    }

Ovenstående eksempel er ikke perfekt i forhold til at illustrere det ekstra lag af fleksibilitet som delegates giver, da det er det samme stykke kode der laver delegaten som bruger den. Man skal forestille sig at en metode laver delegaten og en anden metode bruger den. Dette giver mulighed for at kalde en metode via en delegate og først runtime, altså i afviklingsøjeblikket at bestemme præcis hvilken metode delegaten kalder.

I ovenstående eksempel bruges delegate objektet til at kalde en metode. Delegate objektet kan også bruges som argument i en metode eller hændelser som beskrevet i starten af dette indlæg.

Ingen kommentarer:

Send en kommentar