Visual Studio C# Dersleri – C# Delegate (Temsilci) Kullanımı 2

Bir önceki konuda tanımladığımız ve kullandığımız delegate(temsilciler) geriye değer döndermiyordu yani tek taraflı çalışıyorlardı değişkenleri dışarıdan alıyor bir işlemde kullanıp sonucu ekranda yazdırmıştık. Şimdi geriye sonuç dönderen delegate tanımlaması ve kullanımında bakalım tanımlama biçimi aynı farklı olarak delegate(temsilci) geriye değer döndereceği için void yerine dönecek olan değişkenin türünü yazıyoruz yani

public delegate int hesap(int sayi1,sayi2);

gibi
hemen bir örnek yapalım örneğimizde dikdörtgenin alanı hesaplanacak bunu için yukarıda yazdığımız delegate tanımlamasını kullanacağız, daha sonrada aynı özelliklere sahip olan bir metot tanımlayarak program içerisinde kullanacağız. Kodlarımız aşağıdaki gibi olacak

using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication4
{
class Program
{
public delegate int hesap(int sayi1, int sayi2);
static int alan(int s1, int s2)
{
return s1 * s2;
}
static void Main(string[] args)
{
hesap temsilci = new hesap(alan);
Console.WriteLine("Dikdörtgenin alanı="+temsilci(5,3));
Console.ReadKey();
}
}
}

örneğimizde hesap isimli bir delegate tanımladık, aynı özelliklere sahip alan isimli bir metot tanımladık
program kısmında hesap isimli delegate kullanmak için temsilci değişkeni ile 5 ve 3 bilgilerini göndererek hesaplama işlemini gerçekleştirdik.

Şimdi birden fazla metot olsaydı nasıl olacaktı ona bakalım aynı örnek için dikdörtgenin çevreside a ve b değişkenlerini kullanıyor yani tanımlayacağımız delegate ile aynı özelliklere sahip hemen kodlarımıza bakalım büyük bir bölümü aynı farklı olan kısımları konu sonunda kısaca açıklayacağım.

using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication4
{
class Program
{
public delegate int hesap(int sayi1, int sayi2);
static int alan(int s1, int s2)
{
return s1 * s2;
}
static int cevre(int s1, int s2)
{
return 2*s1 + 2*s2;
}
static void Main(string[] args)
{
hesap temsilci = new hesap(alan);
temsilci += cevre;
Delegate[] dizi = temsilci.GetInvocationList();
Console.WriteLine("Dikdörtgenin alanı="+dizi[0].DynamicInvoke(5,3));
Console.WriteLine("Dikdörtgenin cevresi="+dizi[1].DynamicInvoke(5, 3));
Console.ReadKey();
}
}
}

Önceki örneğimizde olduğu gibi direk temsilci(5,3) yazarak programı çalıştırırsanız sadece cevre metotu çalışır çünkü çoklu metot kullanan temsilcilerde en son tanımlanan metot ilk çalıştırılıyordu.Biz tüm metotların aynı çalışmasını istediğimiz için delegate içinde tanımlı her metotda ayrı ayrı bilgileri göndermemiz gerekiyor bunun için Delegate[] dizi = temsilci.GetInvocationList(); satırı ile tanımlı metotların listesini dizi isimli değişkene aktarıp dizi[0].DynamicInvoke(5,3) ve dizi[1].DynamicInvoke(5,3) satırları ile metotlara ayrı ayrı bilgileri göndermiş olduk.. Şimdilik bukadar .. 🙂

Pin It on Pinterest