﻿
{"id":2280,"date":"2013-11-13T22:28:43","date_gmt":"2013-11-13T22:28:43","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=2280"},"modified":"2013-11-13T22:28:43","modified_gmt":"2013-11-13T22:28:43","slug":"c-funconceden-tanimlanmis-delege-turu","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-funconceden-tanimlanmis-delege-turu\/","title":{"rendered":"C# &#8211; Func<T,TResult>(\u00d6nceden Tan\u0131mlanm\u0131\u015f Delege T\u00fcr\u00fc)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>\u00d6nceki yaz\u0131lar\u0131mdan <a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-delegatetemsilci-ve-eventolay-kullanimi\/\" target=\"_blank\">C# Delegate(Temsilci) ve Event(Olay) Kullan\u0131m\u0131<\/a> ba\u015fl\u0131kl\u0131 makalemizde ayr\u0131nt\u0131l\u0131 bir bi\u00e7imde delegelerden bahsetmi\u015ftim.Delege, metodlar\u0131n adreslerini yani metodlar\u0131 fiziksel olarak i\u015faretleyebilen yap\u0131lar oldu\u011funu hat\u0131rlayal\u0131m.Tan\u0131mlad\u0131\u011f\u0131m\u0131z delegenin yap\u0131s\u0131na g\u00f6re i\u015faretleyece\u011fi metodlar de\u011fi\u015fiklik g\u00f6sterebiliyordu.Buradan yola \u00e7\u0131karak, ihtiyac\u0131m\u0131z olan delegeyi belirli bir yap\u0131 sayesinde daha pratik tan\u0131mlay\u0131p daha sonra o delegeye uygun bir metod atamam\u0131z\u0131 &#8220;Func&lt;T,TResult&gt;&#8221; tipi sayesinde ger\u00e7ekle\u015ftiriyoruz ve bu i\u015fleme &#8220;\u00d6nceden Tan\u0131mlanm\u0131\u015f Delege&#8221; diyoruz.Bu makalemizde bu i\u015flemin nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 ve Func delegesini detayl\u0131 bir bi\u00e7imde inceleyece\u011fiz.<br \/>\n<!--more--><br \/>\n\u00d6ncelikle Func&lt;T,TResult&gt; tipini birazdaha detayl\u0131 bir bi\u00e7imde irdeleyelim.<br \/>\nFunc tipi, bir veya birden fazla(<span style=\"font-size: x-small;\">16 haneye kadar<\/span>) parametre alabilen ve geriye T tipinde de\u011fer d\u00f6nd\u00fcren bir delege yap\u0131s\u0131d\u0131r.Bu delege sayesinde, alaca\u011f\u0131 parametreler ve geriye d\u00f6nd\u00fcrece\u011fi de\u011feri simgeleyen delegemizi tan\u0131mlayabilir ve o tan\u0131mlad\u0131\u011f\u0131m\u0131z yap\u0131daki herhangi bir metodu bu delegeye i\u015faretletebiliriz.E\u011fer bir i\u015flemde delegeye ihtiyac\u0131n\u0131z varsa, Func ile h\u0131zl\u0131 ve pratik bir \u015fekilde ihtiyac\u0131n\u0131z\u0131 giderebilir ve delegeyle u\u011fra\u015fman\u0131za gerek kalmayabilir.<\/p>\n<p><strong>Peki Func&lt;T,TResult&gt; ile nas\u0131l delege tan\u0131mlan\u0131yor?<\/strong> diye sorarsan\u0131z e\u011fer a\u015fa\u011f\u0131daki kodu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nFunc&lt;string,string,bool&gt;\r\n<\/pre>\n<p>Yukar\u0131daki tan\u0131m\u0131 incelersek e\u011fer, &#8220;string&#8221; tipte iki parametre alan ve geriye &#8220;bool&#8221; tipinde de\u011fer d\u00f6nd\u00fcren bir delege tan\u0131mlanm\u0131\u015f oluyor.Yukar\u0131da da bahsetti\u011fim gibi Func tipinde 16 haneye kadar parametre tan\u0131mlayabiliyoruz.Haliyle bu tan\u0131mlanan tiplerden hangisinin parametre hangisinin geri d\u00f6n\u00fc\u015f de\u011feri oldu\u011funu nerden anl\u0131yoruz diye sorarsan\u0131z e\u011fer, n tane tip tan\u0131mlad\u0131ysak, n+1 inci tip geri d\u00f6n\u00fc\u015f tipi olarak kabul edilmektedir.A\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fclerini incelersek olay\u0131 daha iyi anlamland\u0131rm\u0131\u015f olabiliriz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/Func1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2284\" alt=\"Func1\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/Func1-300x118.png\" width=\"300\" height=\"118\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/Func1-300x118.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/Func1.png 306w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/Func2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2287\" alt=\"Func2\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/Func2-300x104.png\" width=\"300\" height=\"104\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/Func2-300x104.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/Func2.png 339w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nYukar\u0131daki ekran g\u00f6r\u00fcnt\u00fclerini incelerseniz e\u011fer, sonuncu parametreye kadar tan\u0131mlanan tipler delegenin parametre tiplerini, sonuncu parametre ise delegenin geri d\u00f6nece\u011fi de\u011ferin tipini ta\u015f\u0131maktad\u0131r.<\/p>\n<p>\u015eimdi bir ka\u00e7 \u00f6rneklendirme yapal\u0131m.<br \/>\n\u0130ki adet &#8220;string&#8221; tipten parametre alan ve geriye &#8220;int&#8221; d\u00f6nen Func yap\u0131s\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nFunc&lt;string,string,int&gt;\r\n<\/pre>\n<p>Bir adet &#8220;int&#8221;, bir adet &#8220;float&#8221; ve iki adet &#8220;bool&#8221; tipinden parametre alan ve geriye &#8220;object&#8221; tipten veri d\u00f6nen Func yap\u0131s\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nFunc&lt;int,float,bool,bool,object&gt;\r\n<\/pre>\n<p>Evet, buraya kadar Func tipinin nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131 mant\u0131ksal a\u00e7\u0131dan izah etmi\u015f olduk.\u015eimdide delegelerde oldu\u011fu gibi tan\u0131mlad\u0131\u011f\u0131m\u0131z bir Func tipine, tan\u0131mlanan yap\u0131daki bir metodu nas\u0131l i\u015faretletece\u011fimizi inceleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Func&lt;int, int&gt; Toplam = ToplamMetodu;\r\n            Console.Write(Toplam(5));\r\n            Console.Read();\r\n        }\r\n\r\n        static int ToplamMetodu(int sayi)\r\n        {\r\n            int Toplam = 0;\r\n            for (int i = 0; i &lt;= sayi; i++)\r\n            {\r\n                Toplam += i;\r\n            }\r\n            return Toplam;\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer, &#8220;int&#8221; tipinde parametre alan ve geriye &#8220;int&#8221; tipinde de\u011fer d\u00f6nd\u00fcren delegemizi Func tipi sayesinde &#8220;Toplam&#8221; isminde tan\u0131mlam\u0131\u015f\u0131z.Haliyle bu delege tan\u0131m\u0131na uyan &#8220;ToplamMetodu&#8221; isminde bir metod tan\u0131mlay\u0131p bunu &#8220;Toplam&#8221; isimli \u00f6nceden tan\u0131mlanm\u0131\u015f delegemize i\u015faretletmi\u015fiz.G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi art\u0131k metodumuzu bir delegeyle istedi\u011fimiz \u015fekilde y\u00f6netebiliyoruz.<\/p>\n<p>\u00d6nceki yaz\u0131lar\u0131mdan <a href=\"http:\/\/www.gencayyildiz.com\/blog\/lambda-ifadeleri-lambda-expressions\/\" target=\"_blank\">Lambda \u0130fadeleri (Lambda Expressions)<\/a> ba\u015fl\u0131lk\u0131 yaz\u0131mda Lambda ifadelerinden bahsetmi\u015ftik.Hat\u0131rlarsan\u0131z e\u011fer bu ifadeleri kulland\u0131\u011f\u0131m\u0131z alanlar Func ile ba\u015flayan parametrelerdi.Func tipinin bir delege oldu\u011funu ve delegelerin metodlar\u0131 i\u015faretledi\u011fini d\u00fc\u015f\u00fcn\u00fcrsek e\u011fer, Lambda ifadelerinin bir metod tan\u0131mlay\u0131c\u0131s\u0131 oldu\u011fu \u00e7\u0131kar\u0131m\u0131n\u0131 yapabiliriz.<\/p>\n<p>\u015eimdi yukar\u0131daki \u00f6rne\u011fi Lambda ifadesi ile yapmaya \u00e7al\u0131\u015fal\u0131m.Burada yapaca\u011f\u0131m\u0131z olay, tan\u0131mlanm\u0131\u015f Func tipine uygun metodu yaz\u0131p i\u015faretletece\u011fimize, o metodu Lambda ifadeleriyle delegemize anlamland\u0131raca\u011f\u0131z.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Func&lt;int, int&gt; Toplam = sayi =&gt;\r\n            {\r\n                int ToplamDeger = 0;\r\n                for (int i = 0; i &lt;= sayi; i++)\r\n                {\r\n                    ToplamDeger += i;\r\n                }\r\n                return ToplamDeger;\r\n            };\r\n\r\n            Console.Write(Toplam(5));\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer, Func tipine &#8220;=&#8221; operat\u00f6r\u00fcnden sonra &#8220;sayi&#8221; isminde bir de\u011fi\u015fken tan\u0131mlam\u0131\u015f olduk.Bu de\u011fi\u015fken &#8220;int&#8221; tipindeki parametrenin de\u011ferini ta\u015f\u0131maktad\u0131r.&#8221;=>&#8221; operat\u00f6r\u00fc ile Scope&#8221;{ }&#8221;(<span style=\"font-size: x-small;\">S\u00fcsl\u00fc parantezler<\/span>) a\u00e7arak geriye &#8220;int&#8221; tipinde de\u011fer d\u00f6nd\u00fcren prosed\u00fcrel kodlar\u0131m\u0131z\u0131 yerle\u015ftirdik.G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi Lambda ifadeleriyle \u00f6nceden tan\u0131mlanm\u0131\u015f delegemizin tipine uygun bir metod tasarlam\u0131\u015f olduk.Bu i\u015flemde .NET&#8217;in pratik yanlar\u0131ndan birisini g\u00f6stermektedir.. \ud83d\ude42<\/p>\n<p>Lambda ifadeleriyle ilgili bu \u00f6rnek tatmin etmeyece\u011finden dolay\u0131 bir \u00f6rnek daha yapal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            int Deger = Convert.ToInt32(Console.ReadLine());\r\n            Func&lt;bool&gt; SinyalVarmi = () =&gt;\r\n            {\r\n                if (Deger == 1)\r\n                {\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    return false;\r\n                }\r\n            };\r\n\r\n            Console.Write(SinyalVarmi());\r\n            Console.ReadLine();\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer, d\u0131\u015far\u0131dan al\u0131nan &#8220;int&#8221; tipindeki de\u011fer e\u011fer 1 ise &#8220;True&#8221;, 1 den farkl\u0131 ise &#8220;False&#8221; d\u00f6nd\u00fcrecek bir algoritma bulunmaktad\u0131r.\u00d6nceden tan\u0131mlanm\u0131\u015f delegemiz hi\u00e7 parametre almamaktad\u0131r, lakin geriye &#8220;bool&#8221; tipinde de\u011fer d\u00f6nd\u00fcrmektedir.Delegemiz parametre almayaca\u011f\u0131ndan dolay\u0131, parantez a\u00e7 kapa&#8221;()&#8221; yaparak metodumuzun parametre almayaca\u011f\u0131n\u0131 belirtiyoruz.Scope&#8217;lar i\u00e7erisine geriye &#8220;bool&#8221; tipinde de\u011fer d\u00f6nd\u00fcrecek kodlar\u0131m\u0131z\u0131 yaz\u0131yoruz.<\/p>\n<p>\u015eimdide konumuzu Lambda ifadelerini genellikle kulland\u0131\u011f\u0131m\u0131z Extension metodlar\u0131m\u0131zla ba\u011fda\u015ft\u0131ral\u0131m.LINQ ya da Entity Framework&#8217;de \u00e7o\u011funlukla kulland\u0131\u011f\u0131m\u0131z Where Extension metodunu inceleyelim.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/ExtensionWhere.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/ExtensionWhere-300x33.png\" alt=\"ExtensionWhere\" width=\"300\" height=\"33\" class=\"aligncenter size-medium wp-image-2296\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/ExtensionWhere-300x33.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/11\/ExtensionWhere.png 532w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nYukardaki Where metodunu incelersek e\u011fer,&#8221;int&#8221; tipinden bir koleksiyonda kullan\u0131ld\u0131\u011f\u0131ndan dolay\u0131, parametresinde &#8220;int&#8221; tipinde parametre alan ve geriye &#8220;bool&#8221; tipinde de\u011fer d\u00f6nd\u00fcren bir metod almaktad\u0131r.Haliyle bu metod Func tipinde ve yukar\u0131daki \u015fartlara uygun bir delegeye i\u015faretlenecektir.Genellikle biz herhangi bir koleksiyonda Where Extension metodunu kullan\u0131yorsak a\u015fa\u011f\u0131daki gibi Lambda ifadeleriyle metodumuzu tan\u0131mlar\u0131z.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            List&lt;int&gt; Sayilar = new List&lt;int&gt;() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };\r\n            List&lt;int&gt; GelenSayilar = Sayilar.Where(sayi =&gt; sayi == 1).ToList();\r\n            foreach (var item in GelenSayilar)\r\n            {\r\n                Console.Write(item);\r\n            }\r\n            Console.ReadLine();\r\n        }\r\n<\/pre>\n<p>Lakin yukar\u0131daki gibi Lambda ifadesi kullan\u0131lmadan a\u015fa\u011f\u0131daki gibi metod tan\u0131mlanarakta delegeye i\u015faretlendirilebilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            List&lt;int&gt; Sayilar = new List&lt;int&gt;() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };\r\n            List&lt;int&gt; GelenSayilar = Sayilar.Where(SayilariGetir).ToList();\r\n            foreach (var item in GelenSayilar)\r\n            {\r\n                Console.Write(item);\r\n            }\r\n\r\n            Console.ReadLine();\r\n        }\r\n\r\n        static bool SayilariGetir(int Sayi)\r\n        {\r\n            return Sayi == 2;\r\n        }\r\n<\/pre>\n<p>Burada sizlere ters mant\u0131k olarak olay\u0131 anlatmaya \u00e7al\u0131\u015ft\u0131m.<\/p>\n<p>Son olarak Func tipinin nerelerde kolayl\u0131k sa\u011flad\u0131\u011f\u0131ndan bahsederek makalemize son vermek istiyorum.<br \/>\nLINQ ve Entity Framework mimarilerinde ya da Extension metodlarda bu kolayl\u0131klardan fark\u0131nda olmasakta yo\u011fun bir \u015fekilde faydalanmaktay\u0131z.Koleksiyon i\u00e7erisinde veri taramas\u0131 gibi i\u015flemleri Func yap\u0131s\u0131 sayesinde daha rahat ger\u00e7ekle\u015ftirebiliyoruz.<\/p>\n<p>Pratik bir yap\u0131ya sahip olan bu tip profesyonel ve esnek yap\u0131lardaki mimarilere \u00e7ok iyi ayak uydurabilmekte ve h\u0131zl\u0131ca \u00e7al\u0131\u015fma olana\u011f\u0131 sunmaktad\u0131r.<\/p>\n<p>Sonraki makalemizde g\u00f6r\u00fc\u015fmek \u00fcmidiyle..<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar..<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>\u00d6nceki yaz\u0131lar\u0131mdan C# Delegate(Temsilci) ve Event(Olay) Kullan\u0131m\u0131 ba\u015fl\u0131kl\u0131 makalemizde ayr\u0131nt\u0131l\u0131 bir bi\u00e7imde delegelerden bahsetmi\u015ftim.Delege, metodlar\u0131n adreslerini yani metodlar\u0131 fiziksel olarak i\u015faretleyebilen yap\u0131lar oldu\u011funu hat\u0131rlayal\u0131m.Tan\u0131mlad\u0131\u011f\u0131m\u0131z delegenin yap\u0131s\u0131na g\u00f6re i\u015faretleyece\u011fi metodlar de\u011fi\u015fiklik g\u00f6sterebiliyordu.Buradan yola \u00e7\u0131karak, ihtiyac\u0131m\u0131z&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,338],"tags":[27,169,528,527],"class_list":["post-2280","post","type-post","status-publish","format-standard","hentry","category-c-sharp-c","category-c-5-0","tag-c","tag-delegate","tag-delege","tag-func"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/2280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=2280"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/2280\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=2280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=2280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=2280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}