﻿
{"id":5172,"date":"2016-10-14T09:56:52","date_gmt":"2016-10-14T09:56:52","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=5172"},"modified":"2016-10-14T09:56:52","modified_gmt":"2016-10-14T09:56:52","slug":"c-7-0-pattern-matching","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-7-0-pattern-matching\/","title":{"rendered":"C# 7.0 &#8211; Pattern Matching"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde C# 7.0 s\u00fcr\u00fcm\u00fcn\u00fcn en g\u00f6zde yenili\u011fi olan <strong><em>Pattern Matching<\/em><\/strong> \u00f6zelli\u011fi \u00fczerinde duraca\u011f\u0131z. Detaya girmeden bahsetmek istiyorum ki, bir \u00e7ok yaz\u0131l\u0131mc\u0131 dostumunda be\u011fenerek kar\u015f\u0131lad\u0131\u011f\u0131 bu yenilik \u015fahsen 7.0 versiyonu i\u00e7erisinde di\u011ferlerine nazaran en kullan\u0131\u015fl\u0131, en pratik ve en kazan\u00e7l\u0131 bir \u00f6zellik te\u015fkil etmektedir. Detayland\u0131rd\u0131ktan sonra anla\u015f\u0131lacakt\u0131r ki, hem gramersel hem de i\u015flevsel olarak bu s\u00fcr\u00fcm\u00fcn mavi boncu\u011funu hak etmi\u015ftir diyebiliriz. Tabi bu nazardan sonra ba\u015f\u0131na ne gelebilir onuda merak etmedim de\u011fil \ud83d\ude42 Neyse hadi gelin \u015fimdi Pattern Matching \u00f6zelli\u011finin s\u0131rr\u0131na vak\u0131f olal\u0131m&#8230;<\/p>\n<p>Bu \u00f6zellik temelde tip sorgulama i\u015flemlerinde bizlere pratiklik kazand\u0131rma esas\u0131na dayanmaktad\u0131r. Biliyorsunuz ki, bizler elimizdeki object tiplerin i\u00e7indeki verileri yahut base class olan yap\u0131lar taraf\u0131ndan refere edilmi\u015f nesnelerin tiplerini &#8220;<a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-is-ve-as-operatorleri\/\" target=\"_blank\">is<\/a>&#8221; operat\u00f6r\u00fc taraf\u0131ndan tespit edebilmekteyiz.<\/p>\n<p>Haz\u0131r laf\u0131n\u0131 etmi\u015fken \u015f\u00f6yle &#8220;is&#8221; operat\u00f6r\u00fcn\u00fcn kullan\u0131m\u0131n\u0131 a\u015fa\u011f\u0131ya alal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            object x = 125;\r\n            if (x is string)\r\n            {\r\n                string xx = x as string;\r\n                Console.WriteLine($&quot;x de\u011fi\u015fkeni string tipindedir.&quot;);\r\n            }\r\n            else if (x is int)\r\n            {\r\n                int xx = (int)x;\r\n                Console.WriteLine($&quot;x de\u011fi\u015fkeni int tipindedir.&quot;);\r\n            }\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere is operat\u00f6r\u00fcn\u00fc bu \u015fekilde kullanarak verimizin tipini belirlemekte ve &#8220;as&#8221; yahut &#8220;cast&#8221; operat\u00f6rleri arac\u0131l\u0131\u011f\u0131yla ilgili de\u011fer kendi tipinde object i\u00e7erisinden elde edilmektedir.<\/p>\n<p>\u0130\u015fte burada yapm\u0131\u015f oldu\u011fumuz \u00f6nce tip kontrol\u00fc(is) ard\u0131ndan ilgili tipte veriyi elde etme(as) i\u015flemleri fazladan kod ve scope yazmam\u0131za sebep olmakta ve kompleks bir \u00e7al\u0131\u015fma tezah\u00fcr ettirmektedir. Haliyle Pattern Matching \u00f6zelli\u011fiyle birazdan g\u00f6rece\u011finiz y\u00f6ntem(ler) sayesinde bu tarz durumlara olduk\u00e7a pratik ve sade bir \u00e7\u00f6z\u00fcm getirilmi\u015ftir.<\/p>\n<p>Pattern Matching, bu ve bunun gibi durumlarda kullanaca\u011f\u0131m\u0131z, i\u015fimizi kolayla\u015ft\u0131rmak ve pratik bir kod in\u015fas\u0131 sa\u011flamak i\u00e7in desenleri a\u015fa\u011f\u0131daki d\u00f6rt kategoride toplam\u0131\u015ft\u0131r;<\/p>\n<ul>\n<li>\n<h3><span style=\"color: #ff0000;\"><strong><em>Type Pattern<\/em><\/strong><\/span><\/h3>\n<p>Type Pattern ile yukar\u0131da yapt\u0131\u011f\u0131m\u0131z \u00f6rneklendirmede oldu\u011fu gibi bir referans yahut object i\u00e7erisindeki tipin belirlenmesi desenle\u015ftirilmi\u015ftir. Yani k\u0131saca tip belirlemede kullanaca\u011f\u0131m\u0131z tasar\u0131md\u0131r.Type Pattern&#8217;den \u00f6nce,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            object x = 125;\r\n            if (x is string)\r\n            {\r\n                string xx = x as string;\r\n                Console.WriteLine($&quot;x de\u011fi\u015fkeni string tipindedir.&quot;);\r\n            }\r\n            else if (x is int)\r\n            {\r\n                int xx = (int)x;\r\n                Console.WriteLine($&quot;x de\u011fi\u015fkeni int tipindedir.&quot;);\r\n            }\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>Type Pattern&#8217;den sorna,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            object x = 125;\r\n\r\n            if (x is string xx)\r\n                Console.WriteLine($&quot;x de\u011fi\u015fkeni string tipindedir.&quot;);\r\n            else if (x is int xx)\r\n                Console.WriteLine($&quot;x de\u011fi\u015fkeni int tipindedir.&quot;);\r\n\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8220;<strong><em>[referans] is [tip] [de\u011fisken]<\/em><\/strong>&#8221; kal\u0131b\u0131ndaki [de\u011fi\u015fken] k\u0131sm\u0131 &#8220;is&#8221; kontrol\u00fcn\u00fcn do\u011frulu\u011funda ilgili referans\u0131 kontrol edilen tipte bize getirmektedir. Yani uzun uzun &#8220;as&#8221; yahut &#8220;cast&#8221; operat\u00f6rleriyle yapt\u0131\u011f\u0131m\u0131z d\u00f6n\u00fc\u015f\u00fcm\u00fc arkaplanda yapt\u0131\u011f\u0131n\u0131 ve bu d\u00f6n\u00fc\u015f\u00fcm sonucunu ilgili tipte [de\u011fi\u015fken]&#8217;e verdi\u011fini d\u00fc\u015f\u00fcn\u00fcn. Bir ba\u015fka deyi\u015fle ilgili referans ilgili tiple e\u015fle\u015ftirildi\u011finde otomatik olarak o tipte veri de\u011fi\u015fkenle elde edilmektedir.<\/li>\n<li>\n<h3><span style=\"color: #ff0000;\"><strong><em>Constant Pattern<\/em><\/strong><\/span><\/h3>\n<p>Elimizdeki veriyi bir sabit de\u011fer ile kar\u015f\u0131la\u015ft\u0131rabiliyoruz.\u00d6rne\u011fin;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            object x = 125;\r\n\r\n            if (x is 128)\r\n                Console.WriteLine($&quot;x de\u011fi\u015fkeninin de\u011feri 128&quot;);\r\n            else if (x is 125)\r\n                Console.WriteLine($&quot;x de\u011fi\u015fkeninin de\u011feri 125&quot;);\r\n            else if (x is 120)\r\n                Console.WriteLine($&quot;x de\u011fi\u015fkeninin de\u011feri 120&quot;);\r\n\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>Bu \u015fekilde kodumuzu \u00e7al\u0131\u015ft\u0131r\u0131rsak \u00e7\u0131kt\u0131 olarak &#8220;<em>x de\u011fi\u015fkeninin de\u011feri 125<\/em>&#8221; ifadesini verecektir.<\/p>\n<p>Bir ba\u015fka \u00f6rnek;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            object x = &quot;Gen\u00e7ay Y\u0131ld\u0131z&quot;;\r\n\r\n            if (x is &quot;Gen\u00e7ay&quot;)\r\n                Console.WriteLine($&quot;Gen\u00e7ay&quot;);\r\n            else if (x is null)\r\n                Console.WriteLine($&quot;null&quot;);\r\n\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere null kontrol\u00fcde sa\u011flayabiliyoruz.<\/li>\n<li>\n<h3><span style=\"color: #ff0000;\"><strong><em>Var Pattern<\/em><\/strong><\/span><\/h3>\n<p>Eldeki veriyi &#8220;var&#8221; de\u011fi\u015fken tipiyle elde etmemizi sa\u011flayan desendir. Hemen a\u015fa\u011f\u0131daki \u00f6rne\u011fi inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            object x = &quot;T\u00fcrkiye&quot;;\r\n            if (x is var a)\r\n            {\r\n                Console.WriteLine(a);\r\n            }\r\n\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>Burada &#8220;x&#8221; de\u011fi\u015fkenini &#8220;var&#8221; ile elde edilerek &#8220;a&#8221; de\u011fi\u015fkenine atanmakta, haliyle a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde de g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi &#8220;a&#8221; de\u011fi\u015fkeninin tipi derleme a\u015famas\u0131nda de\u011fil Run Time(\u00c7al\u0131\u015fma Zaman\u0131nda)&#8217;da belirlenmektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/10\/C-7.0-\u2013-Pattern-Matching.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-5197\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/10\/C-7.0-\u2013-Pattern-Matching.png\" alt=\"C# 7.0 \u2013 Pattern Matching\" width=\"766\" height=\"154\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/10\/C-7.0-\u2013-Pattern-Matching.png 766w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/10\/C-7.0-\u2013-Pattern-Matching-300x60.png 300w\" sizes=\"auto, (max-width: 766px) 100vw, 766px\" \/><\/a><\/li>\n<li>\n<h3><span style=\"color: #ff0000;\"><strong><em>Recursive Pattern<\/em><\/strong><\/span><\/h3>\n<p>S\u0131ra geldi benim favorim olan desene \ud83d\ude42 Bu desen <em>switch &#8211; case<\/em> yap\u0131s\u0131 \u00fczerinde bir\u00e7ok yenilik getirmektedir.<\/p>\n<p>Bu yenilikler;<\/p>\n<ul style=\"list-style-type: circle;\">\n<li>Art\u0131k t\u00fcm tipler switch &#8211; case yap\u0131s\u0131nda kullan\u0131labilecek.<\/li>\n<li>case &#8211; break bloklar\u0131nda yukar\u0131da anlat\u0131lan t\u00fcm desenler uygulanabilmektedir.<\/li>\n<li>case komutlar\u0131na \u00e7e\u015fitli condition(\u015fart, ko\u015ful) verilebilmektedir.<\/li>\n<\/ul>\n<p>\u015eimdi a\u015fa\u011f\u0131daki kod blo\u011funu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void X(ICloneable instance)\r\n        {\r\n            switch (instance)\r\n            {\r\n                case SqlConnection connection:\r\n                    connection.ConnectionString = &quot;Server=.;Database...&quot;;\r\n                    break;\r\n                case SqlCommand command when (command.Connection.ConnectionString == &quot;Server=.;Database...&quot;):\r\n                    command.CommandText = &quot;Select * from...&quot;;\r\n                    break;\r\n                case StreamWriter stream:\r\n                    stream.Write(&quot;...&quot;);\r\n                    break;\r\n                case null:\r\n                    break;\r\n            }\r\n        }\r\n<\/pre>\n<p>Dikkat ederseniz, switch blo\u011funa referans tipli bir de\u011fi\u015fken verilmi\u015ftir ve bu de\u011fi\u015fkenin refere etti\u011fi nesnenin tipini case blo\u011funda sorgulayarak herhangi bir e\u015fle\u015fme durumunda &#8220;connection&#8221;, &#8220;command&#8221; yahut &#8220;stream&#8221; isimleri verilen de\u011fi\u015fkenler arac\u0131l\u0131\u011f\u0131yla ilgili nesneyi o ilgili tipte elde ediyoruz. Ayr\u0131ca when komutu ile verilen condition sa\u011fland\u0131\u011f\u0131 vakit ilgili case &#8211; break blo\u011fu tetiklenecektir.<\/p>\n<p>Recursive Pattern i\u00e7erisinde referanslar\u0131n g\u00f6sterdikleri nesnelerin tiplerini belirledi\u011fimiz i\u00e7in Type Pattern ve null kontrol\u00fc sa\u011flad\u0131\u011f\u0131m\u0131z i\u00e7inde Constant Pattern kullanabilmekteyiz.\n<\/li>\n<\/ul>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi Pattern Matching \u00f6zelli\u011fi olduk\u00e7a taktire \u015fayan bir yeniliktir. Bizleri nas\u0131l bir zahmet ve kod karma\u015fas\u0131ndan kurtard\u0131\u011f\u0131na \u015fahit olduk san\u0131r\u0131m. Anla\u015f\u0131lan makalemizin sonuna geldik ama size g\u00fczel bir haber vererek konumuzu noktalamak istiyorum. Microsoft, Pattern Matching \u00f6zelli\u011fi i\u00e7in s\u00fcre\u00e7te daha \u00e7ok geli\u015ftirilece\u011fini ve bu \u00f6zellik \u00e7er\u00e7evesinde daha fazla yenilik veya desen gelece\u011fini bildirmekte ve ucu a\u00e7\u0131k olarak konuyu haf\u0131zalara kaz\u0131maktad\u0131r.<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/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>Merhaba, Bu i\u00e7eri\u011fimizde C# 7.0 s\u00fcr\u00fcm\u00fcn\u00fcn en g\u00f6zde yenili\u011fi olan Pattern Matching \u00f6zelli\u011fi \u00fczerinde duraca\u011f\u0131z. Detaya girmeden bahsetmek istiyorum ki, bir \u00e7ok yaz\u0131l\u0131mc\u0131 dostumunda be\u011fenerek kar\u015f\u0131lad\u0131\u011f\u0131 bu yenilik \u015fahsen 7.0 versiyonu i\u00e7erisinde di\u011ferlerine nazaran&#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":5118,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,1490],"tags":[1491,1518,1520,1519,1523,1521,1522],"class_list":["post-5172","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-7-0","tag-c-7-0","tag-c-7-0-yenilikleri","tag-constant-pattern","tag-pattern-matching","tag-recursive-pattern","tag-type-pattern","tag-var-pattern"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/5172","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=5172"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/5172\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/5118"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=5172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=5172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=5172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}