﻿
{"id":25106,"date":"2022-05-28T16:57:11","date_gmt":"2022-05-28T16:57:11","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=25106"},"modified":"2022-05-28T16:57:11","modified_gmt":"2022-05-28T16:57:11","slug":"c-11-ile-gelen-generic-attribute-yapilanmasi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-11-ile-gelen-generic-attribute-yapilanmasi\/","title":{"rendered":"C# 11 \u0130le Gelen Generic Attribute Yap\u0131lanmas\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde C# programlama dilinin 11. versiyonunda gelerek b\u00fcy\u00fck bir eksikli\u011fi giderecek olan ve mimarisel \u00e7al\u0131\u015fmalarda t\u00fcr\/type ile ilgili manevralarda kodumuza\/yap\u0131m\u0131za olduk\u00e7a esneklik kazand\u0131racak olan <em>Generic Attribute<\/em> \u00f6zelli\u011fini inceliyor olaca\u011f\u0131z.<\/p>\n<p>Esas\u0131nda C# 11 \u00f6ncesi s\u00fcr\u00fcmlerde, attribute&#8217;lar\u0131n generic olabilmesi desteklenmedi\u011finden dolay\u0131, bu \u00f6zellikle pratik bir \u015fekilde \u00e7\u00f6z\u00fcm getirilebilecek senaryolarda farkl\u0131 ve zahmetli yakla\u015f\u0131mlara y\u00f6nelerek ne kadar ihtiya\u00e7 duyulabilir ve kritik bir yap\u0131 oldu\u011funa dair kanaat getirdi\u011fimiz, <em style=\"font-size:12px;\">&#8216;ulan \u015fu attribute&#8217;lar\u0131 da generic olarak ayarlayabileydik ke\u015fke&#8217;<\/em> \u015feklinde serzeni\u015flerde bulundu\u011fumuz pek \u00e7ok tecr\u00fcbemiz olmu\u015ftur. Ayn\u0131 \u015fekilde sizlerin de en az benim kadar bu \u00f6zelli\u011fin olmas\u0131n\u0131 istedi\u011finiz durumlar ya\u015fad\u0131\u011f\u0131n\u0131za inan\u0131yorum. \u0130\u015fte b\u00f6yle ihtiya\u00e7 hissedilmi\u015f bir maziye sahip olan bir \u00f6zelli\u011fin yeni olarak dile kat\u0131l\u0131m g\u00f6sterdi\u011fi s\u00fcre\u00e7te pekte bu \u00f6zellikle ilgili tan\u0131t\u0131m yap\u0131labilecek bir yan\u0131n\u0131n olmad\u0131\u011f\u0131 kanaatindeyim. Nihayetinde ihtiyac\u0131n\u0131 bilenler i\u00e7in olduk\u00e7a l\u00fczumlu bir \u00f6zellikken, bilmeyenler i\u00e7in ise art\u0131k attribute kavram\u0131n\u0131n par\u00e7as\u0131 olarak de\u011ferlendirilebilecek bir niteliktir.<\/p>\n<p>\u015eimdi bizler i\u00e7eri\u011fimize bu \u00f6zelli\u011fi bekleyenlerin hissiyat\u0131yla devam edelim.<\/p>\n<p><strong><em>Peki hoca, bu generic attribute \u00f6zelli\u011fi gelmeden \u00f6nce attribute&#8217;lar da ki t\u00fcrle ilgili i\u015flemleri nas\u0131l ger\u00e7ekle\u015ftiriyordunuz?<\/em><\/strong> \u015feklinde ilgili \u00f6zelli\u011fin evveliyat\u0131n\u0131 de\u011ferlendirmemizi sa\u011flayacak kritik bir soruyla seyredelim istiyorum.<\/p>\n<p>Evet, eskiden attribute&#8217;lar da t\u00fcr i\u015flemleri ger\u00e7ekle\u015ftirirken &#8216;Type&#8217; t\u00fcr\u00fcnden a\u015fa\u011f\u0131daki gibi istifade ederek i\u015flemlerimizi ger\u00e7ekle\u015ftiriyorduk.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass TypeAttribute : Attribute\r\n{\r\n    public Type Type { get; }\r\n    public TypeAttribute(Type type)\r\n        =&gt; Type = type;\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer farazi ama\u00e7l\u0131 olu\u015fturulmu\u015f olan &#8216;TypeAttribute&#8217; isimli attribute&#8217;un i\u00e7erisinde bir t\u00fcr tan\u0131mlamas\u0131 yapabilmek i\u00e7in &#8216;Type&#8217; t\u00fcr\u00fcnden bir referans tutmaktay\u0131z. Bu referans \u00fczerinden yap\u0131lacak operasyon i\u00e7in gerekli t\u00fcr tan\u0131mlamas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi ger\u00e7ekle\u015ftirmekteyiz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&#x5B;Type(typeof(int))]\r\nclass MyClass { }\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte generic attributes \u00f6zelli\u011finden \u00f6nce bu \u015fekilde bir \u00e7al\u0131\u015fma sergiliyorduk.<\/p>\n<p>Halbuki generic attributes \u00f6zelli\u011fi sayesinde art\u0131k attribute tan\u0131mlamalar\u0131nda a\u015fa\u011f\u0131daki gibi generic tan\u0131mlamada bulunabiliyor ve b\u00f6ylece yap\u0131y\u0131 komple generic hale getirebiliyoruz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass TypeAttribute&lt;T&gt; : Attribute\r\n{\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>Kullan\u0131m olarak da a\u015fa\u011f\u0131daki gibi olduk\u00e7a basit ve sade bir davranu\u015f sergilememizi sa\u011flamaktad\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&#x5B;Type&lt;int&gt;()]\r\nclass MyClass { }\r\n<\/pre>\n<\/div>\n<p>Tabi bu \u00f6zelli\u011finde belirli s\u0131n\u0131rlamalar\u0131 mevcuttur. Misal olarak generic s\u0131n\u0131flarda, generic attribute&#8217;lar\u0131 kullan\u0131rken akla gelebilece\u011fi gibi direkt olarak generic parametreleri kullanamamaktay\u0131z.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-Ile-Gelen-Generic-Attribute-Yapilanmasi.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-Ile-Gelen-Generic-Attribute-Yapilanmasi.png\" alt=\"C# 11 \u0130le Gelen Generic Attribute Yap\u0131lanmas\u0131\" width=\"419\" height=\"135\" class=\"aligncenter size-full wp-image-25120\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-Ile-Gelen-Generic-Attribute-Yapilanmasi.png 419w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-Ile-Gelen-Generic-Attribute-Yapilanmasi-300x97.png 300w\" sizes=\"auto, (max-width: 419px) 100vw, 419px\" \/><\/a>Anlayaca\u011f\u0131n\u0131z b\u00f6yle bir durumda generic t\u00fcr direkt olarak bildirilmelidir.<\/p>\n<p>Ayr\u0131ca generic attribute&#8217;lar da a\u015fa\u011f\u0131daki t\u00fcrler desteklenmemektedir;<\/p>\n<ul>\n<li><code>dynamic<\/code><\/li>\n<li><code>nint<\/code><\/li>\n<li><code>nuint<\/code><\/li>\n<li><code>string?<\/code> (Burada int?, float? gibi primitive olan t\u00fcrlerin nullable&#8217;lar\u0131n\u0131n desteklendi\u011fini unutmay\u0131n\u0131z!)<\/li>\n<li><code>(int a, int b)<\/code> (Tuple)<\/li>\n<\/ul>\n<p>Bunlar\u0131n yerine s\u0131ras\u0131yla a\u015fa\u011f\u0131daki t\u00fcrleri kullanabilirsiniz;<\/p>\n<ul>\n<li><code>object<\/code><\/li>\n<li><code>IntPtr<\/code><\/li>\n<li><code>UIntPtr<\/code><\/li>\n<li><code>string<\/code><\/li>\n<li><code>ValueTuple&lt;int, int&gt;<\/code><\/li>\n<\/ul>\n<p>Nihai olarak;<br \/>\nC#, olmas\u0131 gerekeni yapm\u0131\u015f ve attribute&#8217;lara generic deste\u011fini kazand\u0131rm\u0131\u015ft\u0131r. Art\u0131k ihtiya\u00e7 duyulan noktalarda g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla kullanabilir ve <em>ohh be<\/em> diyebiliriz \ud83d\ude42<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki 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# programlama dilinin 11. versiyonunda gelerek b\u00fcy\u00fck bir eksikli\u011fi giderecek olan ve mimarisel \u00e7al\u0131\u015fmalarda t\u00fcr\/type ile ilgili manevralarda kodumuza\/yap\u0131m\u0131za olduk\u00e7a esneklik kazand\u0131racak olan Generic Attribute \u00f6zelli\u011fini inceliyor olaca\u011f\u0131z. Esas\u0131nda C# 11&#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":25103,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,4580],"tags":[313,4581,4590,4593,4592,4591],"class_list":["post-25106","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-11","tag-attribute","tag-c-11","tag-c-11-generic-attribute","tag-c-attribute","tag-c-generic-attribute","tag-generic-attributes"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25106","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=25106"}],"version-history":[{"count":18,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25106\/revisions"}],"predecessor-version":[{"id":25129,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25106\/revisions\/25129"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/25103"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=25106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=25106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=25106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}