Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Tüm Başlıklar XML

1.  .Net'de managed function pointer

Örneğin;
public delegate bool Compare(int i1, int i2);
koduyla adı Compare olan bir delegate tanımlanmış olur. Bu delagete dönüş tipi bool olan ve iki int tipinde parametre alan bütün fonksiyonları temsil eder.

Delegateler bir metodun adresi ile çağrılması için kullanılır. Yukarıdaki delegate'i kullanan bir örnek yazalım:
public delegate bool Compare(int i1, int i2);

public class DelegateDeneme
{
    public bool MyCompare(int sayi1, int sayi2){
        return sayi1 == sayi2;
    }

    public static void Main(){
        Compare cmp = new Compare(MyCompare);

        Console.WriteLine( cmp(1, 2) ); // False yazar.
        Console.WriteLine( cmp(5, 5) ); // True yazar
    }
}


Konuyla ilgili olarak bkz: event
fizikci
26 Haziran 2005 15:28 ~ 24 Kasım 2005 14:51
2.  Her ne kadar C#'da delegate'lerin farklı bir görüntüsü olsa da, sonuçta MSIL'e derlendiğinde delegate'ler için birer class generate edilir. Örneğin
public delegate bool Compare(int i1, int i2);
şeklinde tanımlanmış Compare delegate'i ildasm.exe tool'u ile incelendiğinde aşağıdaki gibi bir sınıfın oluşturulduğu görülecektir;

class Compare : MulticastDelegate
{
    [MethodImpl(0, MethodCodeType=MethodCodeType.Runtime)]
    public virtual IAsyncResult BeginInvoke(int x, int y, AsyncCallback callback, object @object);

    [MethodImpl(0, MethodCodeType=MethodCodeType.Runtime)]
    public virtual bool EndInvoke(IAsyncResult result);

    [MethodImpl(0, MethodCodeType=MethodCodeType.Runtime)]
    public override bool Invoke(int x, int y);
}

Generate edilen bu sınıftan anlaşılacağı üzere  delegate'ler aslında MulticastDelegate sınıfından türetilmiş, virtual metodları CLR tarafından implement edilen sınıflardır.

MulticastDelegate gibi sınıflar özel sınıflar kapsamında olup, kullanıcıların bu sınıfları base class olarak kullanmasına izin verilmez. Bu sınıflardan türetme işlemini ancak derleyiciler yapabilir.

Invoke metodu delegate üzerinden asıl metoda dolaylı aktarım yapmak için CLR tarafından kullanılır. Yani koddaki cmp(1,2) -> .Invoke(1,2)'ye o da -> MyCompare(1,2)'ye çağrı yapar. Buna parametre aktarımı deniyor. Bu metod Visual Basic .NET programcısı tarafından kullanılabilirken, C#'ta kullanılamıyor.
fizikci
24 Kasım 2005 14:48 ~ 30 Kasım 2005 10:28
3.  .NET'in delegate'leri, C'deki function pointer'ların aksine, birden fazla metoda çağrı yapabilir. Bu metodlara invocation list denir.

Delegate'in çağrı listesine yeni metod eklemek için C#'ta += operatörü, Visual Basic .NET'te ise Combine metodu kullanılır. Çağrı listesindeki bir metodu çıkarmak için ise C#'ta -= operatörü, VB'de Remove metodu kullanılır.

Bu metod ekleme çıkarma işlemlerinde VB'de metod isminin başında AddressOf operatörü kullanılmalıdır, C#'ta ise bir metodun ismi zaten adresi anlamına geldiği için direk metod ismi kullanılabilir.

Çağrı listesine erişmek için delegate'in GetInvocationList() metodu kullanılır. Bu metod bir delegate dizisi döndürür.

C# için örnek :
public delegate void Metod();

public class DelegateDeneme
{
    public static void Metod1(){ Console.WriteLine("Metod1"); }
    public static void Metod2(){ Console.WriteLine("Metod2"); }
    public static void Metod3(){ Console.WriteLine("Metod3"); }

    public static void CagriListesiniGoster(Delegate d)
    {
        foreach(Delegate del in d.GetInvocationList())
            Console.WriteLine(del.Method.Name);
    }

    public static void Main()
    {
        Metod m = new Metod(Metod1);
        m += new Metod(Metod2);
        m += new Metod(Metod3);
        CagriListesiniGoster(m); // metod1, metod2, metod3 yazar.

        m -= new Metod(Metod2);
        CagriListesiniGoster(m); // metod1, metod3 yazar.

        Console.ReadLine();
    }
}

fizikci
30 Kasım 2005 15:03
Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.


Bu başlığa bkz veren girişlerin başlıkları nedir?

Bu başlığa bkz veren girişler başka hangi başlıklara bkz verdiler?
© 2005, Bilişim Kulübü. (1125 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen