.NET 2.0 ile birlikte delegate(temcilsi) yapılarını da generic olarak tanımlama şansı elde etmiş olduk. Delegate, bir olay gerçekleştiği zaman bunu ilgili yerlere(metodlara) bildiren temsilcilerdir. Delegate tabanlı işlem yapılacağı zaman öncelikle delegate türünde bir temsilci metod tanımlanır ardından sözkonusu olay gerçekleştiği zaman bu temsilcinin bilgilendirme yapacağı metodlar, temsilci metodun listesine eklenir. Çalışma zamanında olay(event) gerçekleştiği zaman temsilci metod yani delegate çağrılır. Temsilci metod da hangi metodları temsil ediyorsa onları tetikler, onları gerçekleşen bu event’ten haberdar eder. Delegate yapılarını, daha sonra “Delegate & Event” konulu bir makalede işleyeceğiz.
Önce basit bir delegate örneği yapalım ve neden generic şablonlu delegate’lere ihtiyacımızın olduğunu görelim. İki metodumuzun olduğunu düşünelim. Her ikisi de iki parametre alıyor ve bu iki parametreyi toplayıp sonucu ekrana yazdırıyor. Tek farkı biri, integer türünde diğeri string türünde değer alıyor. String türünde değer alan metod, argümanları matematiksel olarak toplayamadığı için birleştirip ekrana yazdırıyor. Öncelikle bu metodları temsil edecek iki delegate tanımlayacağız.
Module Module1 'Delegateleri tanımlayalım. 'Bu metodlar, temsilci rolünde olduğu için içeriği bulunmamaktadır. Public Delegate Sub DlgInt(ByVal a As Integer, ByVal b As Integer) Public Delegate Sub DlgStr(ByVal a As String, ByVal b As String) '===========Tetiklenecek metodlar============= 'İki int sayısı toplar Sub IntToplama(ByVal x As Integer, ByVal y As Integer) Console.WriteLine("{0} + {1} = {2}", x, y, x + y) End Sub 'iki string değeri birleştirir Sub StrToplama(ByVal x As String, ByVal y As String) Console.WriteLine("{0} + {1} = {2}", x, y, x + y) End Sub '========Main() metodu================ Sub Main() Dim d1 As New DlgInt(AddressOf IntToplama) d1(10, 20) Dim d2 As New DlgStr(AddressOf StrToplama) d2("Ahmet", "Kaymaz") End Sub End Module
class Program { //Delegateleri tanımlayalım. //Bu metodlar, temsilci rolünde olduğu için içeriği bulunmamaktadır. public delegate void DlgInt(int a, int b); public delegate void DlgStr(string a, string b); //===========Tetiklenecek metodlar============= //İki int sayısı toplar static void IntToplama(int x, int y) { Console.WriteLine("{0} + {1} = {2}",x, y, x+y); }//IntToplama //iki string değeri birleştirir static void StrToplama(string x, string y) { Console.WriteLine("{0} + {1} = {2}", x, y, x + y); }//StrToplama //========Main() metodu================ static void Main(){ DlgInt d1 = new DlgInt(IntToplama); d1(10,20); DlgStr d2 = new DlgStr(StrToplama); d2("Ahmet", "Kaymaz"); }//Main }//Program
10 + 20 = 30
Ahmet + Kaymaz = AhmetKaymaz
Görüldüğü gibi benzer işlemleri yapmalarına rağmen farklı türde parametre aldıkları için her biri için ayrı delegate’ler tanımlandı. Yeni versiyonda sunulan generic delegate mimarisi burada da çözüm sunmaktadır. Her iki metod için tek bir delegate şablonu oluşturmak yeterli olacaktır.
Module Module1 'Generic bir delegate tanımlayalım. Public Delegate Sub Dlg(Of T)(ByVal a As T, ByVal b As T) '===========Tetiklenecek metodlar============= 'İki int sayısı toplar Sub IntToplama(ByVal x As Integer, ByVal y As Integer) Console.WriteLine("{0} + {1} = {2}", x, y, x + y) End Sub 'iki string değeri birleştirir Sub StrToplama(ByVal x As String, ByVal y As String) Console.WriteLine("{0} + {1} = {2}", x, y, x + y) End Sub '========Main() metodu================ Sub Main() Dim d1 As New Dlg(Of Integer)(AddressOf IntToplama) d1(10, 20) Dim d2 As New Dlg(Of String)(AddressOf StrToplama) d2("Ahmet", "Kaymaz") End Sub End Module
class Program
{
//Generic bir delegate tanımlayalım.
public delegate void Dlg
Sonuç olarak görüldüğü gibi generic mimarisi sayesinde CLR’ın en önemli güvencesi olan type-safety(tip güvenliği) özelliği korunmuş ve programcı açısından da türden bağımsız bir yapı sağlanmıştır.