DELEGATE OOP-UYG
Delegate en basit anlamıyla metod referansıdır Delegate en basit anlamıyla metod referansıdır. Yani delegate metod referansını tutar. Delegate tanımlanırken metodun geri dönüş değeri ve parametreleri belirlenir. Geri dönüş değerini void ve parametresiz tanımlamak da mümkündür. Kullanılacak metod, tanımlanmış olan delegate geri dönüş ve parametrelerine uygun olmalıdır. Delegenin(delegate) başvurduğu bir metodu dinamik olarak değiştirebiliriz. Dolayısıyla bir delegeyi çağıran kod her çalıştığında farklı bir metod çalıştırabilir. Delegate kullanılması metodları daha rahat kontrol etmemizi sağlayacak ve uygulamamızın performansını artıracaktır. http://www.erenguvercin.com/2013/05/c-delegate-kullanm.html
Delegateler de nesne referanslarına benzerler, fakat aradaki temel fark bir nesneye değil metoda referans etmeleridir. Not: Delagateler C++ da kullanılan fonksiyon pointerlarına benzerler.
ÖRNEK1 Markette satın alınan ürünler için fiş çıkaracaksınız. Satın alınan ürünün kaç tane olduğunu biliyorsunuz. Bu ürünler için hem KDV dahil hem de KDV hariç fiyatlarını göstereceksiniz. Bunun için iki ayrı metod tanımlayabilir ve bunları delegate yardımıyla kullanabilirsiniz. Örneğimizin kodları ve açıklamaları aşağıdaki gibi.
using System; using System. Collections. Generic; using System using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Program public delegate decimal Hesaplama(int adet); static void Main(string[] args) Hesaplama del = Fiyat; Console.WriteLine("KDV Hariç 5 Ürün" + " Fiyatı: {0}", del(5)); del = KDVFiyat; //delegate değiştiriliyor Console.WriteLine("KDV Dahil 5 Ürün" + Console.ReadLine(); } static decimal Fiyat(int sayi) { //Fiyat 10.5 kabul edilerek hesaplandı. (KDV Hariç) return sayi * 10.5m; } static decimal KDVFiyat(int sayi) decimal kdvharicfiyat = sayi * 10.5m; //KDV %18 düşünüldü return kdvharicfiyat + kdvharicfiyat * 0.18m; http://www.erenguvercin.com/2013/05/c-delegate-kullanm.html
ÖRNEK2 delegate int MathOperation(int x, int y);" ile basit bir delege tanımı yapalım. Tanımı yaparken saklayacağı metodların dönüş tiplerinin int olması gerektiğini ve bu metodların int tipinde 2 parametre alması gerektiğini belirtelim. Daha sonra ise "MathOperation mathOp = new MathOperation(SimpleMath.Add)“ ile mathOp delege nesnesi oluşturalım. Nesne örneği oluşturulurken construtor üzerinden bu delege nesnesine SimpleMath.Add metodunu saklaması için eklenecek. delegemiz bu metodu saklar hale gelecek. "mathOp(5,3)" bu şekilde delege nesnemiz üzerinden sakladığı metot olan SimpleMath.Add metoduna 5 ve 3 değerlerini verip bu metodu çalıştıralım. Program çalıştığında çıktı 5+3'ten "Add : 8" şeklinde olacaktır.
public static int Subtract(int x, int y) { int retVal = x - y; Console public static int Subtract(int x, int y) { int retVal = x - y; Console.WriteLine("Subtract : " + retVal); return retVal; } static void Main(string[] args) MathOperation mathOp = new MathOperation(SimpleMath.Add); mathOp(5, 3); Console.ReadKey(); using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Program delegate int MathOperation(int x, int y); public class SimpleMath public static int Add(int x, int y) int retVal = x + y; Console.WriteLine("Add : " + retVal); return retVal; } http://safakunel.blogspot.com.tr/2013/12/c-delegate-kullanimi-delege-nedir.html
ÖRNEK3 public delegate int hesap(int sayi1,sayi2); dikdörtgenin alanı hesaplanacak bunu için yukarıda yazdığımız delegate tanımlamasını kullanacağız hesap isimli bir delegate tanımlanacak, aynı özelliklere sahip alan isimli bir metot tanımlanacak 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ştirilecektir.
static void Main(string[] args) { hesap temsilci = new hesap(alan); Console.WriteLine("Dikdörtgenin alanı=" + temsilci(5, 3)); Console.ReadKey(); } 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; } http://www.bilisimogretmeni.com/visual-studio-c/visual-studio-c-dersleri-c-delegate-temsilci-kullanimi-2.html
ÖRNEK4 Birden fazla metod olduğunda;
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(); } 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;
Ö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
ÖRNEK5 OrnekDelegate ismi ile tanımladığımız delegateimiz hem Topla hemde Cikar fonksiyonlarına aynı anda işaret ederek tek bir seferde ile ikisini birden çağırabilir. Aşağıdaki örneğimiz de göreceğiniz gibi += ile delegate’e yeni metot eklerken -= ilede daha önce eklediğimiz metodu çıkarabiliriz.
static void Main(string[] args) { OrnekDelegate aritmetikMetodlar; aritmetikMetodlar = new OrnekDelegate(Topla); aritmetikMetodlar += new OrnekDelegate(Cikar); aritmetikMetodlar(2, 5); aritmetikMetodlar -= new OrnekDelegate(Topla); aritmetikMetodlar(3, 9); Console.ReadLine(); } using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication4 { class Program delegate void OrnekDelegate(int a, int b); static void Topla(int a, int b) Console.WriteLine("a + b = {0}", a + b); } static void Cikar(int a, int b) Console.WriteLine("a - b = {0}", a - b); http://www.yazilimmutfagi.com/10165/dersler/cSharp/yazilim-mutfagi-dersleri-cSharp-ders-8-cSharp-da-delegate-tanimlama-ve-kullanimi.aspx