﻿
{"id":24085,"date":"2021-12-22T20:53:14","date_gmt":"2021-12-22T20:53:14","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=24085"},"modified":"2021-12-22T20:53:14","modified_gmt":"2021-12-22T20:53:14","slug":"c-10-callerargumentexpression-attributeu","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-10-callerargumentexpression-attributeu\/","title":{"rendered":"C# 10 &#8211; CallerArgumentExpression Attribute&#8217;u"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, C#&#8217;\u0131n geli\u015fim yolunda ge\u00e7mi\u015fteki tart\u0131\u015fmalar\u0131 nihayete erdiren ve C# 8.0&#8217;da duyurulup, ertelenen, C# 9.0&#8217;da beklenirken sonunda C# 10 ile gelen <em>CallerArgumentExpression<\/em> attribute&#8217;u \u00fczerine incelemede bulunuyor olaca\u011f\u0131z.<\/p>\n<h4 style=\"color:#e83e8c;\">Caller? Attribute&#8217;u Tan\u0131d\u0131k m\u0131 Geliyor?<\/h4>\n<p>Evet, C# 5&#8217;ten bu yana .NET&#8217;te kullan\u0131lan ve ad\u0131 <em>Caller<\/em> ile ba\u015flayan \u00fc\u00e7 adet attribute mevcuttur. Bunlar; <em style=\"color:green;\">System.Runtime.CompilerServices<\/em> namespace&#8217;i alt\u0131ndaki <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-5-0-caller-information\/\" rel=\"noopener\" target=\"_blank\">CallerMemberName, CallerFilePath ve CallerLineNumber<\/a> attribute&#8217;lar\u0131d\u0131r. Bu attribute&#8217;lar metot parametrelerinde kullan\u0131larak, \u00f6zelliklerine g\u00f6re ilgili metodun nereden, hangi metot taraf\u0131ndan \u00e7a\u011fr\u0131ld\u0131\u011f\u0131, dosya yolu ve koddaki sat\u0131r numaras\u0131 bilgilerini d\u00f6nd\u00fcren sihirli niteliklerdir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static class LogService\r\n    {\r\n        public static void Log(string logMessage,\r\n            &#x5B;CallerMemberName] string memberName = &quot;&quot;,\r\n            &#x5B;CallerFilePath] string filePath = &quot;&quot;,\r\n            &#x5B;CallerLineNumber] int lineNumber = 0)\r\n        {\r\n            \/\/...\r\n            Console.WriteLine(memberName);\r\n            Console.WriteLine(filePath);\r\n            Console.WriteLine(lineNumber);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Caller attribute&#8217;lar\u0131n\u0131n hedeflenen metoda dair bilgiler edinebilmeleri i\u00e7in i\u015faretledikleri parametrelerin opsiyonel olmalar\u0131 gerekmektedir. Yani ilgili parametrelere default de\u011ferlerin atanm\u0131\u015f olmas\u0131 gerekiyor. Haliyle ilgili metodun tetiklendi\u011fi noktada bu opsiyonel parametrelere herhangi bir de\u011fer iletmeksizin mahiyetlerine uygun verilerle doldurulduklar\u0131n\u0131 g\u00f6receksiniz. Misal olarak;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing services;\r\n\r\nclass Program\r\n{\r\n    public static void Main()\r\n    {\r\n        LogService.Log(&quot;Merhaba&quot;);\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131z zaman a\u015fa\u011f\u0131daki gibi \u00e7\u0131kt\u0131 verecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/12\/C-10-CallerArgumentExpression-Attributeu.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/12\/C-10-CallerArgumentExpression-Attributeu.png\" alt=\"C# 10 - CallerArgumentExpression Attribute&#039;u\" width=\"480\" height=\"51\" class=\"aligncenter size-full wp-image-24095\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/12\/C-10-CallerArgumentExpression-Attributeu.png 480w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/12\/C-10-CallerArgumentExpression-Attributeu-300x32.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/a>En nihayetinde compiler&#8217;\u0131n, derleme s\u00fcrecinde bu metodu a\u015fa\u011f\u0131daki misali tekrar in\u015fa etti\u011fini s\u00f6yleyebilmekteyiz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing services;\r\n\r\nclass Program\r\n{\r\n    public static void Main()\r\n    {\r\n        LogService.Log(&quot;Merhaba&quot;,\r\n            &quot;Main&quot;,\r\n            @&quot;C:\\Users\\Gencay\\source\\repos\\functions\\functions\\Program.cs&quot;,\r\n            7);\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Bu attribute&#8217;lara dair daha teferruatl\u0131 bilgi i\u00e7in y\u0131llar \u00f6nce klavyeye ald\u0131\u011f\u0131m\u0131z ve yukar\u0131daki paragraflarda referans etti\u011fimiz <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-5-0-caller-information\/\" rel=\"noopener\" target=\"_blank\">C# 5.0 Caller Information<\/a> ba\u015fl\u0131kl\u0131 makaleye(her ne kadar eski olsa da hala g\u00fcncelli\u011fini korumaktad\u0131r) sizleri buyur ediyorum&#8230;<\/p>\n<p>\u015eimdi bizler g\u00fcn\u00fcn astolistine odaklanacak ve C# 10 ile Caller attribute&#8217;lar\u0131 aras\u0131na kat\u0131lan <em>CallerArgumentExpression<\/em> niteli\u011fini incelemeye ba\u015flayaca\u011f\u0131z&#8230;<\/p>\n<h4 style=\"color:#e83e8c;\">CallerArgumentExpression Attribute&#8217;u Nedir?<\/h4>\n<p><em>CallerArgumentExpression<\/em>, C# 10 ile gelen ve bir metodun herhangi bir parametresinin de\u011ferini metinsel olarak yakalayabilmemizi sa\u011flayan attribute&#8217;dur. Evet, bu a\u00e7\u0131klaman\u0131n pek ayd\u0131nlat\u0131c\u0131 olmad\u0131\u011f\u0131n\u0131 biliyorum. En do\u011frusu ilgili attribute&#8217;u basit bir \u00f6rnek \u00fczerinde kullanarak incelemekte fayda var.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static class Data\r\n    {\r\n        public static void Control(bool value,\r\n            &#x5B;CallerArgumentExpression(&quot;value&quot;)] string expression = &quot;&quot;)\r\n        {\r\n            Console.WriteLine($&quot;value : {value} \\t| expression : {expression}&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere di\u011fer Caller* attribute&#8217;lar\u0131nda oldu\u011fu gibi <em>CallerArgumentExpression<\/em>&#8216;da yine opsiyonel bir parametreye uygulanmaktad\u0131r. Burada ilgili attribute belirtilen de\u011fere kar\u015f\u0131l\u0131k gelen parametrenin(value) de\u011ferini metinsel olarak al\u0131r ve &#8216;expression&#8217; parametresine atar. Dolay\u0131s\u0131yla;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        Data.Control(3 &gt; 5);\r\n        Data.Control(true || ((true &amp;&amp; false) || false &amp;&amp; true));\r\n<\/pre>\n<\/div>\n<p>\u015feklinde kullan\u0131m durumlar\u0131nda buradaki condition ifadelerinin metinsel olarak a\u015fa\u011f\u0131daki gibi elde edilmesini sa\u011flamaktad\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/12\/C-10-CallerArgumentExpression-Attributeu-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/12\/C-10-CallerArgumentExpression-Attributeu-1.png\" alt=\"C# 10 - CallerArgumentExpression Attribute&#039;u\" width=\"586\" height=\"34\" class=\"aligncenter size-full wp-image-24104\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/12\/C-10-CallerArgumentExpression-Attributeu-1.png 586w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/12\/C-10-CallerArgumentExpression-Attributeu-1-300x17.png 300w\" sizes=\"auto, (max-width: 586px) 100vw, 586px\" \/><\/a>\u0130\u015fte bu davran\u0131\u015f, compiler taraf\u0131ndan hedef parametreye verilen ifadenin kendisi(ger\u00e7ek ifadenin kendisi, ifadenin sonucu de\u011fil!) metinsel de\u011fere d\u00f6n\u00fc\u015ft\u00fcr\u00fclerek <em>CallerArgumentExpression<\/em> uygulanan parametreye iletilmesi sonucunda ortaya \u00e7\u0131kmaktad\u0131r.<\/p>\n<p>Burada, ifadesi yakalanmak istenen parametrenin ad\u0131n\u0131 <em>CallerArgumentExpression<\/em> attribute&#8217;una vermek mecburiyetinde oldu\u011fumuz a\u015fikar. Burada ne yaz\u0131k ki, parametre adlar\u0131na attribute kapsam\u0131ndan eri\u015femedi\u011fimizden dolay\u0131 <code>nameof<\/code> keyword&#8217;\u00fcn\u00fc kullanamamaktay\u0131z. \u00dczg\u00fcn\u00fcm ama bu durumda kod geli\u015ftiricinin metinsel de\u011fer yazabilme becerisini konu\u015fturmas\u0131 gerekmektedir \ud83d\ude42<\/p>\n<p>Art\u0131k C# 10 ile hayat\u0131m\u0131za giren bu attribute sayesinde uygulamalar\u0131n loglama yahut do\u011frulama gibi operasyon s\u00fcre\u00e7lerinde daha zengin i\u015flemler ger\u00e7ekle\u015ftirilebilece\u011fi kanaatindeyim&#8230; Hay\u0131rl\u0131 olsun \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#&#8217;\u0131n geli\u015fim yolunda ge\u00e7mi\u015fteki tart\u0131\u015fmalar\u0131 nihayete erdiren ve C# 8.0&#8217;da duyurulup, ertelenen, C# 9.0&#8217;da beklenirken sonunda C# 10 ile gelen CallerArgumentExpression attribute&#8217;u \u00fczerine incelemede bulunuyor olaca\u011f\u0131z. Caller? Attribute&#8217;u Tan\u0131d\u0131k m\u0131 Geliyor?&#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":24114,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,4484],"tags":[4486,4487,4488,4485,4489],"class_list":["post-24085","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-10","tag-c-10","tag-c-10-callerargumentexpression","tag-c-10-yenilikleri","tag-callerargumentexpression","tag-system-runtime-compilerservices"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24085","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=24085"}],"version-history":[{"count":25,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24085\/revisions"}],"predecessor-version":[{"id":24113,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24085\/revisions\/24113"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/24114"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=24085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=24085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=24085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}