9 Eylül 2015

Delegates 3 :Çoklu uygulama

Bütün delegatelerin çoklu uygulama özelliği vardır. Bu demek oluyor ki  bir delegate birden fazla metdou referans olarak alabilir.

Delegate + ve += kullanımı

Burada delegatemize yeni method eklenecektir.
 
OrnekDelegate d= OrnekMethod1;
d+=SomeMethod2;
Son fonksiyon aşağıdaki gibi de yazılabilir
d=d+SomeMethod2;

Artık d OrnekMethod1 ve OrnekMethod2 yi birlikte çalıştıracak.
Delegateler eklenme sırasına göre çalışacaktır.

Delegate - ve -= kullanımı

Burada metodmuzun içerisinden var olan metod silinecektir. Yukarıdaki += örneğinden devam edecek olursak
d - = OrnekMethod1;
yazdığımızda d metodundan OrnekMethod1 çıkarılacaktır. Ve sadece OrnekMethod2 çalışacaktır.

Eğer d null iste d+= OrnekMethod1 ile d=OrnekMethod1 aynı şeydir.
Eğer d null ise d-=OrnekMethod1  d=null olarak dönecektir.
Eğer d metodu void olmazsa yani int olursa . İkinci method ilk methodun return etmesinden sonra başlar. Ve Oradan dönen değeri kullanmaz.

Aşağıdaki örnektende görüleceği gibi. Eğer dönen değeri kullansaydı dönen değer 81 olmalıydı ama sadece tanımladığı paratmetrenin kullanmasına izin verildi.
using System;

namespace Delegates2
{
    delegate int OrnekDelegate(int x);
    class Program
    {
        static int OrnekMethod1(int x) { return x * x; }
        static int OrnekMethod2(int x) { return x * x; }
        static void Main(string[] args)
        {
            OrnekDelegate d = OrnekMethod1;
            d += OrnekMethod2;
            Console.Write(d(3));//9
            Console.ReadKey();
        }
    }
}

Çoklu Uygulama için aşağıdaki örneği incleyelim.

using System;

namespace Delegates2
{
    public delegate void IlerlemeDurumu(int tamamlananYuzde);

    public class Util
    {
        public static void ZorIslem(IlerlemeDurumu i)
        {
            for (int j = 0; j <= 10; j++)
            {
                i(j * 10);
                System.Threading.Thread.Sleep(100);
            }
        }
    }
    class Program
    {
        static void IlerlemeDurumunuConsolaYazdir(int tamamlanYuzde)
        {
            Console.WriteLine(tamamlanYuzde);
        }
        static void IlerlemeDurumunuDosyayaYazdir(int tamamlananYuzde)
        {
            System.IO.File.WriteAllText("durum.txt", tamamlananYuzde.ToString());
        }
        static void Main(string[] args)
        {
            IlerlemeDurumu i =IlerlemeDurumunuConsolaYazdir;
            i += IlerlemeDurumunuDosyayaYazdir;
            Util.ZorIslem(i);

            Console.ReadKey();
        }
    }
}