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;
        }

    }

Delegate tanımlama şekilleri

Bir olay gerçekleştiğinde birden fazla fonksiyonu çağırmak istediğinizi düşünelim. Örneğin kullanıcı bir düğmeye tıkladığında birden fazla method’un otomatik olarak çağrılmasını istiyorsunuz. Bunun için delagate kullanabilirsiniz. Burada amaç şu. Bir olay olduğunda birden fazla yere bu olayı bildirebilmek. Bu olay ile ilgilenler delegate ile olaydan haberleri olur.
delagate olarak bir method tanımlanır. Bu method aslında temsilcidir. Bir olay olduğunda siz delegate method’unu çağrırsınız. delegate method’una kendisini ekleyen method’lar otamatik olarak çağrılırlar.
Tanımlama 1

delegate double CalArePointer(int r);
static CalArePointer cpointer = CalculateArea;
static void main(string[] args)
{
    double area = cpointer.Invoke(20)
}
static double CalculateArea(int r)
{
    return 3.14 * r * r;
}
//Çıktı:1256.0

Tanımlama 2

delegate double CalArePointer(int r);
static void main(string[] args)
{
    CalAreapointer cpointer = new CalArepointer (
                                                delegate(int r){
                                                    return 3.14 * r * r;
                                                    }
                                                )
    double area = cpointer(20);
}
//Çıktı:1256.0

Tanımlama 3

delegate double CalArePointer(int r);
static void main(string[] args)
{
    //Lamda Expression
    CalAreapointer cpointer = r => 3.14 * r * r;
    double Area = cpointer(20);
}
//Çıktı:1256.0

Tanımlama 4

static void main(string[] args)
{
    //Lamda Expression
    Funccpointer = r => 3.14 * r * r;
    double Area = cpointer(20);
}
//Çıktı:1256.0