Delegate kullanımı

Delegate’ler bir metodun referansı olarak kullanılırlar. Dolayısı ile nesneleri heap’de durur. FIFO Mantığıyla çalışır.

    delegate int Matematik(int x);
    delegate void MyGenericDelegate(T args); //generic delegate
    class Program
    {
        static void Main(string[] args)
        {
            //generic delegate
            MyGenericDelegate stringDelegate = new MyGenericDelegate(StringTarget);
            stringDelegate("Safak");

            MyGenericDelegate intDelegate = new MyGenericDelegate(IntTarget);
            intDelegate(26);

            //Aşağıdaki list ile Delegenin üzerindeki metotları görebiliriz.
            Delegate[] DelegeMetodListesi = stringDelegate.GetInvocationList();

            //Action - Void türü methodlar için kullanılır, geri sonuç döndürmez.
            Action<int,string> action = new Action<int,string>(DisplayAge);
            action(28,"CEM");

            //Func - Geri değer döndüren methodlar için kullanılır.
            Func<DateTime, double> func = new Func<DateTime, double>(GetUserAgeAtTime);
            double dateDif = func(DateTime.Now.AddYears(-2));
            Console.WriteLine("\nDate Dif: {0}", dateDif);

            //Delegate
            Matematik canta = new Matematik(KareAl);
            canta += new Matematik(KupAl); // delege ekleme
            canta -= new Matematik(KareAl); // delege çıkarma
            Console.WriteLine(canta.Invoke(5)); //delege çalıştırır.

            int delegesonu = canta(3); //delege çalıştırır(canta.Invoke(3) aynı işi yapar).
            Console.ReadKey();
        }

        static double GetUserAgeAtTime(DateTime birthDate)
        {
            return (DateTime.Now - birthDate).TotalDays;
        }

        static void StringTarget(string arg)
        {
            Console.WriteLine("arg in uppercase is: {0}", arg.ToUpper());
        }
        static void IntTarget(int arg)
        {
            Console.WriteLine("++arg is: {0}", ++arg);
        }
        static void DisplayAge(int age, string name)
        {
            Console.WriteLine("Name: {0}, Age: {1}", name, age);
        }

        static int KareAl(int sayi)
        {
            return sayi * sayi;
        }

        static int KupAl(int sayi)
        {
            return sayi * sayi * sayi;
        }

    }