Delegate, bir metoda atıfta bulunan bir nesnedir. Bir başka deyişle metotlara referans oluşturabilen bir referans tipli değişken olduğunu söyleyebiliriz.
C#’daki delegateler, C/C++’daki function pointer’a benzer. Bir event (olay) tetiklendiğinde hangi metodun çağrılacağını söyleyen bir yol sağlar. Örneğin, bir formda (Windows Form uygulaması) bir Düğmeye tıklarsanız, program belirli bir metodu çağırır. Basit bir ifadeyle, belirli bir parametre listesi ve dönüş türü ile metotlara yapılan başvuruları temsil eden ve ardından gerektiğinde yürütme için bir programda metodu çağıran bir türdür.
Delegate Hakkında Önemli Noktalar:
- Metotları kapsüllemek (encapsulate) için iyi bir yol sağlar.
- Delegate’ler System namespace altındaki ad alanındaki library class’dır.
- Delegateler genel olarak call-back (geri arama) metotlarının ve eventlerin uygulanmasında kullanılır.
- Tek bir event’de iki veya daha fazla metot çağrılabileceğinden, delegateler birbirine zincirlenebilir (Multi Cast Delegates).
- Delegetler, “anonim metotlar” çağrısında da kullanılabilir.
Delegate Tanımlama
Delegate tipi, delegate anahtar sözcüğü kullanılarak bildirilebilir. Bir delegate bildirildiğinde, delegate örneği, dönüş türü ve parametre listesi delegate bildirimiyle eşleşen metotlara başvuracak ve onları çağıracaktır.
Sözdizimi (Syntax):
[modifier] delegate [return_type] [delegate_name] ([parameter_list]);
modifier: Temsilcinin erişimini tanımlayan gerekli değiştiricidir ve kullanımı isteğe bağlıdır.
delegate: Delegate tanımlamak için kullanılan anahtar kelimedir.
return_type: Delegate’in çağıracağı metotlar tarafından döndürülen değer türüdür. Void olabilir. Bir metot, temsilci ile aynı dönüş türüne sahip olmalıdır.
delegate_name: Delegate için kullanıcı tanımlı ad veya tanımlayıcıdır.
parameter_list: Bu, delegate aracılığıyla çağrıldığında metodun gerektirdiği parametreleri içerir.
Örnek:
// "public" -> modifier
// "int" -> return type
// "NewDelegate" -> delegate_name
// "(int i, int j)" -> parameter_list
public delegate int NewDelegate(int i, int j);
Not: Bir delegate, yalnızca imzası ve dönüş türü ile uyumlu olan bir metodu çağırır. Bu metot, bir sınıfla ilişkili statik bir metot olabilir veya bir nesneyle ilişkili bir metot olabilir.
Delegate Çağırma
Bir delegate tanımlandıktan sonra, new anahtar sözcüğü yardımıyla bir delegate nesnesi oluşturulur. Bir delegate başlatıldıktan sonra, delegate yapılan bir metot çağrısı, delegate tarafından o metoda iletilir. Çağrıcı tarafından temsilciye iletilen parametreler metoda iletilir ve varsa metotdan dönen değer, delegate arafından çağırıcıya döndürülür. Çağırıcı, temsilciyi çağırmak kullandığımız yapıdır.
Sözdizimi (Syntax):
[delegate_name] [instance_name] = new [delegate_name](calling_method_name);
Örnek:
NewDelegate newdelegate = new NewDelegate (method);
// "NewDelegate" -> delegate ismi
// "newdelegate" -> instance ismi
// "method" -> çağrılan metodun ismi
Delegate Örnek Kullanım
internal class Program
{
// Geriye değer döndürmeyen iki adet parametre alan bir delegate tanımlıyoruz.
public delegate void numDelegate(int a, int b);
// method "sum"
public static void sum(int a, int b)
{
Console.WriteLine("Toplam = {0}", a + b);
}
// method "subtract"
public static void subtract(int a, int b)
{
Console.WriteLine("Fark = {0}", a - b);
}
// Main Method
public static void Main(String[] args)
{
// numdelegate1 adında bir delagete objesi oluşturuyoruz.
// parametre olarak sum methodunu gönderiyoruz.
numDelegate numdelegate1 = new numDelegate(sum);
// değerleri delegate nesnesine göre metotlara iletiyoruz.
numdelegate1(100, 40);
// numdelegate2 adında bir delagete objesi oluşturuyoruz.
// parametre olarak subtract methodunu gönderiyoruz.
numDelegate numdelegate2 = new numDelegate(subtract);
// değerleri delegate nesnesine göre metotlara iletiyoruz.
numdelegate2(100, 40);
}
}
Sonuç:
Toplam = 140
Fark = 60
Açıklama: Bir adet geriye değer döndürmeyen ve iki parametre alan bir delegate tanımladık. Sonrasında delegate’de yükleme yapacağımız metot ile tanımladığımız metotların imzalarının aynı olması gerektiğinden dolayı yine geriye değer döndürmeyen ve iki adet parametre alan sum ve subtract adlarında metotlar tanımladık.
Son olarak main method’umuzun içerisinde delegate nesnemiz üzerinde methodlarımıza referans yüklemesi yaptık.
4 comments
Comments are closed.