" Umut, hiç görmeyen birine gökkuşağını anlatmak kadar zor ve imkansız... "

Categories

-

Vb.Net Delegates ve Events 1 !!!

Arkadaslar yazmis oldugum kullanici takip otomasyonu için program yazilimi versiyon kontrolu koymam gerekti, yani yeni bir versiyon olup olmadigini kontrol ettirip varsa eger kullanici tarafindan indirilip yüklenmesi için bir uyari verdirmem gerekliydi. Bunun için internette bazi uygulamlar ve kaynaklara baktim, isin asli anladim desem dogru olmazdi. Sonrasinda bir uygulamanin kaynak kodlarini indirip incelemeye basladim. Buda beni alip, delegates ve event olaylarina götürdü, asp.net;den events olaylarini biliyordum ama masaüstü programlama yaziliminda vb.net veya c# da hiç kullanmamistim. internette buldugum ve gerçekten cok güzel hazirlanmis olan delegeler ve olaylar yazisini kaynak gösterip burda paylasmak istedim.

Degiskenler gibi metodlar da bellek üzerinde özel bir alanda yasar. Degisken pointerleri gibi metodlarin baslangiç adresini isaret eden pointerler bulunur. Bunlara metod isaretçileri (function pointers) denilir. Istenirse metodlar, hafiza üzerinden sadece isimleriyle degil bu pointerler sayesinde de çagrilabilir. C veya C++’da bu yöntem yogun olarak kullanilmaktaydi. .NET’in eskiden alisagelmis unmanaged pointer destegi C# ile sinirlidir. VB.NET, bu destekten yoksundur. Fakat destekledigi pointer yapisi CLS ile uyumlu olmadigi için tür güvenligi sunmaz. Bu yüzden .NET, fonksiyon isaretçileriyle ayni amaca sahip tür güvenligi saglayan delege (delegate) isimli isaretçiler sunar.

Fransizca’daki "délégué" sözcügünden dilimize geçmis olan delege, terim olarak, kendisine yetki verilerek bir yere veya birinin katina gönderilen kimse, elçi anlamina gelir. Yazilim dilinde ise metodlara aracilik eden, onlari temsil eden, onlara erismemizi saglayan çalisma zamaninda tanimlanan yapilardir. Delegate, daha önceki function pointerler’den farkli olarak sadece statik metodlari isaret etmez, hem statik hem de nesne (instance) metodlari isaret eder.

Peki delegatelere nerede ihtiyaç duyariz. Iki yerde ihtiyaç duyariz; Bilindigi gibi uygulamamizin hangi metodlari yürütecegi derlenme asamasinda belirlenir. Böylece CLR, çalisma zamaninda, zamani geldiginde ilgili metodlari çalistirir. Fakat bazen çalisma zamaninda planda olmayan bir metodu yürütmek zorunda kalabiliriz. Bunun için delegateler kullanilir. Delegateleri kullandigimiz ikinci alan ise event’lerdir. Bir olay(event) gerçeklestigi zaman bir veya daha fazla metodu, gerçeklesen olaydan haberdar etmek için delegeler kullaniriz. Olay gerçeklestigi zaman hangi metodlar çagrilacaksa onlari delegelere eklemeliyiz. Aslinda delegeler, eventlerle anlam kazanir. Bir sonraki bölümde bunu anlatacagiz.


Delegateleri kullanma, üç asamada gerçeklestirilir;

1. Tanimlama(Declaration),
2. Örnekleme, gerçeklenme (Instantiation),
3. Çagirma(Invocation)

Delegeler, VB.NET ve C# tarafinda "delegate" sözcügüyle, metodlar gibi tanimlanir. Function veya Sub method olabilirler. Delegeleri, class’lar gibi tanimlayabiliriz nitekim derleyici, MSIL tarafinda olusturdugumuz delege ile ayni isimde ve System.MulticastDelegate sinifindan inherit edilmis bir class yaratir. Asagida iki tane delege tanimlanmistir.

Delegeler, VB.NET ve C# tarafinda "delegate" sözcügüyle, metodlar gibi tanimlanir. Function veya Sub method olabilirler. Delegeleri, class’lar gibi tanimlayabiliriz nitekim derleyici, MSIL tarafinda olusturdugumuz delege ile ayni isimde ve System.MulticastDelegate sinifindan inherit edilmis bir class yaratir. Asagida iki tane delege tanimlanmistir.

Public Delegate Sub MyDelegate1()
Public Delegate Function MyDelegate2(ByVal Deger As Integer) As Integer

Görüldügü gibi aslinda delegateler, baska metodlara aracilik eden özel metodlardir. Bir delegeyi kullanilabilir yapmak için ondan bir instance yaratip parametre olarak hangi metodlari temsil edecegi girilmelidir. Burada dikkat edilmesi gereken nokta, delegate’i temsilci kabul edecek metod veya metodlarin delegate ile ayni imza (signature) yapisina sahip olmasi gerekir yani parametre sayi, sira ve türlerinin ayni olmasi gerekir. Örnekteki MyDelegate1 delegesi, parametre almayan ve geriye bir deger döndürmeyen tüm metodlari temsil edebilir. Ayni sekilde MyDelegate2 delegesi, sadece disardan integer türünde parametre alan ve geriye integer türü deger döndüren metodlari temsil edebilir. Metodlari, delegeyle iliskilendirmek için VB.Net tarafinda metodlarin hafiza üzerindeki adresini döndüren AddressOf operatörü, C# tarafinda ise metodun ismi kullanilir. Çünkü C#’ta metodun ismi ayni zamanda metodun adresini açiklar.

Delegate’lerin sagladigi diger özellik ise metodlara parametre olarak baska bir metodu göndermemize izin vermesidir.
Ayrica delegate özel bir sinif türü oldugu için, namespace elemani olarak class disinda da tanimlanabilir. Asagidaki gibi MyDelagate isimli delegeyi "Islem" metodunu temsil edecek sekilde kullanima hazirlayabiliriz.

Module Module1
    'Declaration
    Public Delegate Function MyDelegate(ByVal Deger As Integer) As Integer
 
    Function KareAl(ByVal Sayi As Integer) As Integer
        Return Sayi * Sayi
    End Function
 
    Sub Main()
        Dim Delege As New MyDelegate(AddressOf KareAl) 'Instantiation
        Console.ReadLine()
    End Sub
End Module

Böylece MyDelegate isimli delegeye KareAl() metodunu çagirma yetkisi verildi. Delege üzerinde fonksiyonu çagirmak için instance’yi kullanmak yeterli olacaktir.

Sub Main()
    Dim Delege As New MyDelegate(AddressOf KareAl) //Declaration
    Dim Kare As Integer = Delege(5) //Invocation
    Console.WriteLine("5'in karesi :{0}", Kare)
End Sub

Bir delegeyi C veya C++’taki function pointerlerden farkli olarak birden fazla metoda temsilci kilabiliriz. Buna çoklu temsilcilik (Multicasting) denilir. Delegenin listesine yeni bir metod eklemek için C#’ta “+=” operatörü, VB.Net’te Combine() metodu kullanilir. Listeden bir metod çikarmak için C#’ta “-=” operatörü, VB.Net’te Remove() metodu kullanilir. Bir delegeyle iliskilendirilmis metodlar o delegenin çagri listesinde yer alir. Bu yüzden delegeyle iliskilendirilmis metodlara erismek için delegenin InvocationList() metodu kullanilir.

NOT : VB.Net’teki Combine() metodunun iki tane overload yapisi var. Ilki, sadece iki tane delegate alir.
Public Shared Function Combine(ByVal a As System.Delegate, ByVal b As System.Delegate) As System.Delegate
Eger ikiden fazla delegate’i combine edeceksek o zaman Combine’nin dizi alan yapisini kullanacagiz.
Public Shared Function Combine(ByVal delegates() As System.Delegate) As System.Delegate


Asagidaki uygulamada MyDelegate isimli bir delege tanimlanmis ve ayni anda 3 metoda aracilik etmesi saglanmistir. Böylece birden fazla metodu bir bütün olarak çalistirmis olacagiz.

Module Module1
    Public Delegate Sub MyDelegate(ByVal Deger1 As Integer, ByVal Deger2 As Integer)
 
    Sub Toplama(ByVal Sayi1 As Integer, ByVal Sayi2 As Integer)
        Console.WriteLine("{0} + {1} = {2}", Sayi1, Sayi2, Sayi1 + Sayi2)
    End Sub
    Sub Carpma(ByVal Sayi1 As Integer, ByVal Sayi2 As Integer)
        Console.WriteLine("{0} * {1} = {2}", Sayi1, Sayi2, Sayi1 * Sayi2)
    End Sub
 
    Sub Bolme(ByVal Sayi1 As Integer, ByVal Sayi2 As Integer)
        Console.WriteLine("{0} / {1} = {2}", Sayi1, Sayi2, Sayi1 / Sayi2)
    End Sub
 
    Sub Main()
        Dim Delege1 As MyDelegate = New MyDelegate(AddressOf Toplama)
        Dim Delege2 As MyDelegate = New MyDelegate(AddressOf Carpma)
        Dim Delege3 As MyDelegate = New MyDelegate(AddressOf Bolme)
 
        Dim CombDeleges() As MyDelegate = {Delege1, Delege2, Delege3}
        'Veya metodlari direk bu satirda da tanimlayabilirdik.
        'Dim CombDeleges() As MyDelegate = {AddressOf Toplama, AddressOf Carpma, AddressOf Bolme}
 
        Dim delege As MyDelegate
        delege = [Delegate].Combine(CombDeleges)
        'Veya
        'delege = delege.Combine(CombDeleges) 
 
        Dim X, Y As Integer
        X = 18 : Y = 3
        delege(X, Y)
 
        Console.ReadLine()
    End Sub
End Module

18 + 3 = 21
18 * 3 = 54
18 / 3 = 6


Simdi de delegenin temsil ettigi listeden bir metod çikaralim (Remove() metodu). Ve temsil ettigi güncel listeyi çekelim (GetInvocationList() fonksiyonu).

'Toplama metodu kaldiriliyor.
delege = [Delegate].Remove(delege, Delege1)
'veya
'delege = delege.Remove(delege, New MyDelegate(AddressOf Toplama))
Dim DlgList() As [Delegate] = delege.GetInvocationList()
 
Console.WriteLine("Delegenin temsil ettigi metodlar :")
Console.WriteLine("-----------------------------------")
For i As Byte = 0 To DlgList.Length - 1
    Console.WriteLine(DlgList(i).Method.Name)
Next
//Toplama metodu kaldiriliyor.
 delege -= new MyDelegate(Toplama);
 Delegate[] DlgList =delege.GetInvocationList();

Console.WriteLine(“Delegenin temsil ettigi metodlar :”);
Console.WriteLine(“———————————–“);
for(byte i=0;i
Delegenin temsil ettigi metodlar :
 -----------------------------------
 Carpma
 Bolme

Kaynak http://www.ahmetkaymaz.com/2007/09/03/delegeler-ve-olaylar-delegates-and-events-i/

Örnek uygulamayi buradan indirebilirsiniz.

  • 0
  • 1089
  • 0

- BUNLARIDA GÖZDEN GEÇİREBİLİRSİNİZ -

HENÜZ YORUM YAPILMAMIŞ !

Yorum yazın

HAKKIMDA

KONULARI TAKİP EDİN

SOSYAL AĞLAR

  • Mesajınızı Gonderin