{"id":165,"date":"2012-04-29T20:18:00","date_gmt":"1970-01-01T00:00:00","guid":{"rendered":"http:\/\/www.yazilimmutfagi.com\/?p=165"},"modified":"2012-04-29T20:18:00","modified_gmt":"1970-01-01T00:00:00","slug":"yazilim-mutfagi-dersleri-csharp-ders-8-csharp-da-delegate-tanimlama-ve-kullanimi","status":"publish","type":"post","link":"https:\/\/www.yazilimmutfagi.com\/index.php\/2012\/04\/29\/yazilim-mutfagi-dersleri-csharp-ders-8-csharp-da-delegate-tanimlama-ve-kullanimi\/","title":{"rendered":"Yazilim Mutfagi Dersleri ( C#) Ders 8 &#8211; C# da Delegate Tanimlama ve Kullanimi"},"content":{"rendered":"<h1>C# da Delegate Tanimlama ve Kullanimi<\/h1>\n<p>Delegate\u2019ler bir metodun referansi olarak kullanilirlar. \u00d6nceki derslerimizde nesneler i\u00e7in referans kullanimi ile ilgili bilgiler vermistik, \u00d6rn:  Personel p = new Personel(); bu \u00f6rnekteki p Personel tipindeki bir nesnenin referansidir.<\/p> \n<p>Delegateler de nesne referanslarina benzerler, fakat aradaki temel fark bir nesneye degil metoda referans etmeleridir.<\/p>  \n<p><strong>Not: Delagateler C++ da kullanilan fonksiyon pointerlarina benzerler.<\/strong><\/p>\n <img decoding=\"async\" src=\"http:\/\/www.yazilimmutfagi.com\/yuklenendosyalar\/image\/sabri\/Csharpdersler\/delegate\/delagates_1.png\" alt=\"delegate in C#\" \/>\n<p>Delegate kullanmadan \u00f6nce,delegate\u2019in isaret edecegi metoda ait tip(type) ve imza(signature) bilgilerine ihtiyacimiz vardir. Bir metoda ait signature bilgisi metodun d\u00f6n\u00fcs tipini ve aldigim parametre tiplerini barindirir.<\/p>\n<p>\u00d6rnegin Sik\u00e7a kullanilan Main metodu ve signature tanimlamasi asagidaki gibidir ;<\/p> \n<pre class=\"brush:csharp\">\nint Main(string [] args)\n{\n   \u2026\n}\n\/\/Signature tanimlamasi:\nint herhangibirMetodAdi(string[] args)\n\n<\/pre>\n<p>Main metodu disinda tanimladigimiz bir metoda ait signature bilgileri de asagidaki gibi olur.<\/p>\n<pre class=\"brush:csharp\">\nint Topla(int a, int b)\n{\n     return a+b;\n}\n\/\/Yukaridaki metot i\u00e7in signature tanimlamasini asagidaki gibi yapabiliriz.\nint matematikselMetot(int p, int q)\n<\/pre>\n\n<p>Ayrica yukaridaki signature tanimlamasi ayni zamanda asagidaki metot i\u00e7inde signature tanimlamasi olabilir.<\/p>\n<pre class=\"brush:csharp\">\nint Cikar(int a, int b)\n{\n    return a-b;\n}\n<\/pre>\n\n\n<p>Yukaridaki \u00d6rneklerde signature tanimlamasindaki metot adi ve parametre adlarinin \u00f6nemli olmadigini anlamissinizdir. Sadece d\u00f6n\u00fcs tipi ve parametre tiplerinin ayni olmasi yeterlidir.<\/p>\n<p>Delegate tanimlamasi yaparken signature bilgisinin \u00f6n\u00fcne delegate kelimesini eklememiz yeterlidir.<\/p>\n<pre class=\"brush:csharp\">delegate int YeniDelegate(int p, int q);<\/pre>\n\n<p>Yukaridaki delegate 2 adet int tipinde parametre alan ve int bir deger d\u00f6nd\u00fcren herhangi bir metot i\u00e7in referans olarak kullanilabilir.<\/p>\n<p>Tanimladigimiz delegate i\u00e7in siniflar i\u00e7in olusturdugumuz gibi asagidaki gibi bir referans nesne olusturmamiz gerekir.<\/p>\n<p><\/p><pre class=\"brush:csharp\">YeniDelegate matematikselMetotlar;<\/pre>\n<p>Yukaridaki tanimladigimiz matematikselMetotlar\u2019i artik ayni signature bilgisine sahip t\u00fcm metotlar i\u00e7in kullanabiliriz. Bunun i\u00e7in asagidaki kod blogunu kullaniriz.<\/p>\n<a href='www.yazilimmutfagi.com'>.<\/a>\n\n<pre class=\"brush:csharp\">matematikselMetotlar =  new YeniDelegate(Ekke);<\/pre>\n<p>Siniflar i\u00e7in nesne olustururken gibi yukaridaki \u00f6rnekleri asagidaki gibi kisaca yazabiliriz.<\/p>\n<pre class=\"brush:csharp\">YeniDelegate  matematikselMetotlar =  new YeniDelegate(Ekke);<\/pre>\n<h2>Delegate \u00fczerinden Metotu \u00c7agirmak.<\/h2>\n<p>Yukaridaki \u00f6rnegimizde delegatemizi Ekle fonksiyonuna isaret ettirdigimize g\u00f6re artik delegate \u00fczerinden metodumuzu asagidaki gibi \u00e7agirabiliriz.<\/p>\n<pre class=\"brush:csharp\">int r = matematikselMetotlar(4,5);<\/pre>\n<p>Yukaridaki anlattiklarimiz toparlayacak olursak asagidaki gibi bir kodumuz olusur.<\/p>\n<pre class=\"brush:csharp\">\nnamespace YazilimMutfagiCSharpDersleri\n{\n    class Test\n    {\n        delegate int OrnekDelegate(int a, int b);\n\n        static void main()\n        {\n            OrnekDelegate aritmetikMetodlar = new OrnekDelegate(Topla);\n            int r = aritmetikMetodlar(2, 5);\n            Console.WriteLine(\"2 + 5 = {0}\", r);\n        }\n        static int Topla(int a, int b)\n        {\n            return a + b;\n        }\n\n    }\n}\n\n<\/pre>\n\n<h2>Multicast Delegate Tanimlamak<\/h2>\n<p>Multicast delegateler yukaridaki \u00f6rnegimizin aksine ayni anda birden fazla metodu isaret edebilir. Isaret edecegi metodlarin signature\u2019lari ayni olmak zorundadir. Yukaridaki \u00f6rnegimizi genisletecek olursan OrnekDelegate ismi ile tanimladigimiz delegateimiz hem Topla hemde Cikar fonksiyonlarina ayni anda isaret ederek tek bir seferde ile ikisini birden \u00e7agirabilir. Asagidaki \u00f6rnegimiz de g\u00f6receginiz gibi += ile delegate\u2019e yeni metot eklerken -= ilede daha \u00f6nce ekledigimiz metodu \u00e7ikarabiliriz. Kodlarimiz yeni hali asagidaki gibi olur;<\/p>\n<a href='www.yazilimmutfagi.com'>.<\/a>\n<pre class=\"brush:csharp\">\nusing System;\n\nnamespace YazilimMutfagiCSharpDersleri\n{\n    class Test\n    {\n        delegate void OrnekDelegate(int a, int b);\n\n        static void main()\n        {\n            OrnekDelegate aritmetikMetodlar;\n\n            aritmetikMetodlar  = new OrnekDelegate(Topla);\n            aritmetikMetodlar += new OrnekDelegate(Cikar);\n            \n            aritmetikMetodlar(2, 5);\n\n            aritmetikMetodlar -= new OrnekDelegate(Topla);\n\n            aritmetikMetodlar(3, 9);\n            \n        }\n        static void Topla(int a, int b)\n        {\n            Console.WriteLine(\"a + b = {0}\", a + b);\n            \n        }\n        static void Cikar(int a, int b)\n        {\n            Console.WriteLine(\"a - b = {0}\", a - b);\n        }\n    }\n}\n\n<\/pre>\n<a href='www.yazilimmutfagi.com'>.<\/a>","protected":false},"excerpt":{"rendered":"<p>Delegate\u2019ler bir metodun referansi olarak kullanilirlar. &#214;nceki derslerimizde nesneler i&#231;in referans kullanimi ile ilgili bilgiler vermistik, &#214;rn: Personel p = new Personel(); bu &#246;rnekteki p Personel tipindeki bir nesnenin referansidir.<\/p>\n","protected":false},"author":517,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[436],"tags":[5102,4351,6345,6054,5690,5735,5167,6086,6246,4424,6262],"_links":{"self":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/posts\/165"}],"collection":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/users\/517"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/comments?post=165"}],"version-history":[{"count":0,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/posts\/165\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/media?parent=165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/categories?post=165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/tags?post=165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}