﻿
{"id":22225,"date":"2021-07-19T01:00:00","date_gmt":"2021-07-19T01:00:00","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=22225"},"modified":"2021-07-19T01:00:00","modified_gmt":"2021-07-19T01:00:00","slug":"c-9-0-module-initializers","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-9-0-module-initializers\/","title":{"rendered":"C# 9.0 &#8211; Module Initializers"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde C# 9.0&#8217;\u0131n son s\u00fcr\u00fcm\u00fcnde g\u00f6ze \u00e7arpan bir \u00f6zellik olan Module Initializer&#8217;\u0131 inceliyor olaca\u011f\u0131z. Hi\u00e7 vakit kaybetmeden gelin direkt konuya sorularla giri\u015f yapal\u0131m..<\/p>\n<p><strong>Module Initializer Nedir?<\/strong><\/p>\n<p>Module Initializer, esas\u0131nda .NET i\u00e7in yeni bir \u00f6zellik de\u011fildir. CLR(Common Language Runtime &#8211; Ortak Dil \u00c7al\u0131\u015fma Zaman\u0131)&#8217;de mevcut olan ancak C# geli\u015ftiricileri taraf\u0131ndan C# 9.0 versiyonunun son s\u00fcr\u00fcm\u00fcne kadar do\u011frudan kullan\u0131lamayan bir \u00f6zelliktir. Module Initializer, uygulama ba\u015flama f\u0131rsat\u0131 bulmadan \u00f6nce de\u011fi\u015fkenlerin ve uygulama durumunun tetiklenmesini sa\u011flayan ve bu tetiklenme neticesinde gerekli \u00f6n tan\u0131mlar\u0131n ya da belirli i\u015flemlerin ger\u00e7ekle\u015ftirilmesine imkan veren ve hatta daha da \u00f6nemlisi debugging s\u00fcre\u00e7lerinde ya\u015fanan kilitlenme gibi durumlardan ka\u00e7\u0131nmam\u0131z\u0131 sa\u011flayan bir \u00f6zelliktir.<\/p>\n<p>Ayr\u0131ca Module Initializer uygulama aya\u011fa kald\u0131r\u0131l\u0131rken belli ba\u015fl\u0131 rutin kontrollerin yap\u0131labilece\u011fi ideal bir zemin sunmaktad\u0131r.<\/p>\n<p><strong>Module Initializer Nas\u0131l Kullan\u0131l\u0131r?<\/strong><\/p>\n<p>Module Initializer, \u00f6z\u00fcnde <code><strong>System.Runtime.CompilerServices<\/strong><\/code> namespace&#8217;i alt\u0131nda bulunan bir attribute&#8217;dur.<\/p>\n<div style=\"text-align:center;\"><code style=\"color:red;\"><strong>public sealed class ModuleInitializerAttribute : Attribute<\/strong><\/code><\/div>\n<p>Kullan\u0131m\u0131 ise a\u015fa\u011f\u0131daki gibidir:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Console.WriteLine(text);\r\n        }\r\n\r\n        static string text;\r\n\r\n        &#x5B;ModuleInitializer]\r\n        public static void Initializers()\r\n        {\r\n            text = &quot;doldur be meyhaneci...&quot;;\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda ekrana &#8216;doldur be meyhaneci&#8230;&#8217; \u00e7\u0131kt\u0131s\u0131 gelecektir. Dikkat ederseniz &#8216;ModuleInitializer&#8217; attribute&#8217;u ile uygulaman\u0131n herhangi bir yerinde &#8216;Initializers&#8217; isimli metodu \u00e7a\u011f\u0131rmaya gerek kalmaks\u0131z\u0131n tetikleyebilmi\u015f ve i\u00e7erisinde gerekli \u00f6ncelikli tan\u0131mlamalar\u0131 ve operasyonlar\u0131 ger\u00e7ekle\u015ftirebilmi\u015f olduk.<\/p>\n<p><strong>Peki Bu Module Initializer&#8217;\u0131n Espirisi Nedir? Constructor veya Static Constructor&#8217;dan Fark\u0131 Nedir?<\/strong><\/p>\n<p>Module Initializer, derlenmi\u015f bir program ilk aya\u011fa kald\u0131r\u0131l\u0131rken \u00e7al\u0131\u015ft\u0131r\u0131lacak fonksiyonu\/fonksiyonlar\u0131 belirlememizi sa\u011flayan bir \u00f6zelliktir. Constructor veya static constructor&#8217;dan temel fark\u0131 nesne \u00fcretim s\u00fcre\u00e7lerinde ya da ilgili s\u0131n\u0131f \u00fczerinden static bir member&#8217;\u0131n kullan\u0131lmas\u0131 esnas\u0131nda bir s\u0131n\u0131fa ait metodun tetiklenmesinden ziyade derlemedeki t\u00fcm s\u0131n\u0131flara uygulanmas\u0131n\u0131 sa\u011flamaktad\u0131r. Yani uzun laf\u0131n k\u0131sas\u0131, bir uygulamay\u0131 derleyip ard\u0131ndan aya\u011fa kald\u0131r\u0131rken herhangi bir nesne olu\u015fumuna, metot \u00e7a\u011fr\u0131m\u0131na yahut static bir operasyon talebine gerek kalmaks\u0131z\u0131n belirli ama\u00e7lar do\u011frultusunda(yukar\u0131daki paragraflarda de\u011finilmi\u015ftir) tetiklenecek metotlar\u0131 Module Initializer sayesinde belirleyebilmekte ve tetikleyebilmekteyiz.<\/p>\n<p>Yap\u0131n\u0131n \u00e7al\u0131\u015fma mant\u0131\u011f\u0131n\u0131 daha net anlayabilmek i\u00e7in a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc incelemeniz yeterli olacakt\u0131r.<br \/>\n<div id=\"attachment_22232\" style=\"width: 810px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/07\/C-9.0-Module-Initializers.gif\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-22232\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/07\/C-9.0-Module-Initializers.gif\" alt=\"C# 9.0 - Module Initializers\" width=\"800\" height=\"742\" class=\"size-full wp-image-22232\" \/><\/a><p id=\"caption-attachment-22232\" class=\"wp-caption-text\">Dikkat edilirse e\u011fer &#8216;A&#8217;, &#8216;B&#8217; ve &#8216;C&#8217; s\u0131n\u0131flar\u0131 i\u00e7lerinde &#8216;ModuleInitializer&#8217; attribute&#8217;u ile i\u015faretlenmi\u015f metotlar bar\u0131nd\u0131rmaktad\u0131rlar. Uygulama \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda(derlenip, aya\u011fa kald\u0131r\u0131ld\u0131\u011f\u0131nda) bu i\u015faretlenmi\u015f metotlar anl\u0131k olarak tetiklenmektedir. <span style=\"color:green;\">Ayr\u0131ca bir uygulamada ka\u00e7 tane &#8216;ModuleInitializer&#8217; ile i\u015faretlenmi\u015f metodun olabilece\u011fi konusunda herhangi bir s\u0131n\u0131r\u0131n olmad\u0131\u011f\u0131n\u0131 g\u00f6rmektesiniz. Sadece uygulaman\u0131n aya\u011fa kalkma s\u00fcrecinde hangi &#8216;ModuleInitializer&#8217;\u0131 tetikleyece\u011fi(s\u0131ras\u0131) derleyicinin keyfine ba\u011fl\u0131d\u0131r.<\/span><br \/><\/p><\/div><\/p>\n<p><strong>Module Initializer Kullan\u0131l\u0131rken Nelere Dikkat Edilmelidir?<\/strong><br \/>\nModule Initializer \u00f6zelli\u011fi \u00f6yle lalettayin her metot taraf\u0131ndan kullan\u0131labilir bir \u00f6zellik de\u011fildir. Module Initializer&#8217;\u0131 kullanabilmek i\u00e7in ilgili attribute ile i\u015faretlenecek metot a\u015fa\u011f\u0131daki \u00f6zellikleri bar\u0131nd\u0131rmal\u0131d\u0131r:<\/p>\n<ul>\n<li><em><code style=\"color:#d20069;\">Static<\/code> olmal\u0131d\u0131r.<\/em><\/li>\n<li><em>Parametresiz olmal\u0131d\u0131r.<\/em><\/li>\n<li><em>Geriye de\u011fer d\u00f6nd\u00fcrmeyen(<code style=\"color:#d20069;\">void<\/code>) olmal\u0131d\u0131r. Asenkron operasyonlarda ise <code style=\"color:#d20069;\">async void<\/code> olmal\u0131d\u0131r!<\/em><\/li>\n<li><em>Generic olmamal\u0131d\u0131r.<\/em><\/li>\n<li><em><code style=\"color:#d20069;\">Public<\/code> veya <code style=\"color:#d20069;\">internal<\/code> olmal\u0131d\u0131r.<\/em><\/li>\n<li><em><code style=\"color:#d20069;\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-7-0-local-functions\/\" rel=\"noopener\" target=\"_blank\">Local function<\/a><\/code> olmamal\u0131d\u0131r.<\/em><\/li>\n<\/ul>\n<p>Ayr\u0131ca &#8216;ModuleInitializer&#8217; attribute&#8217;u ile i\u015faretlenerek Module Initializer haline getirilen bir metot, geli\u015ftirici taraf\u0131ndan a\u00e7\u0131k\u00e7a \u00e7a\u011fr\u0131lmad\u0131k\u00e7a herhangi bir mod\u00fcl i\u00e7in tam olarak bir kez \u00e7al\u0131\u015facakt\u0131r. Bunun d\u0131\u015f\u0131nda, Module Initializer taraf\u0131ndan do\u011frudan ya da dolayl\u0131 olarak \u00e7a\u011fr\u0131lanlar d\u0131\u015f\u0131nda hi\u00e7bir metot, Module Initializer i\u015flevini tamamlamadan herhangi bir mod\u00fcldeki property&#8217;lere, metotlara yahut verilere eri\u015femez!<\/p>\n<p><strong>Module Initializer&#8217;\u0131 Main&#8217;de Kullan\u0131rsak Ne Olur?<\/strong><br \/>\nHemen deneyelim \ud83d\ude42 Tabi bunun i\u00e7in default olarak <code>private<\/code> ve parametreli gelen &#8216;Main&#8217;i biraz dekore etmemiz gerekecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static int count = 0;\r\n\r\n        &#x5B;ModuleInitializer]\r\n        public static void Main()\r\n        {\r\n            Console.WriteLine($&quot;{++count}. tetikleme&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kodu derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda &#8216;ModuleInitializer&#8217; attribute&#8217;u &#8216;Main&#8217; metodunu ilgin\u00e7 bir \u015fekilde iki kez tetikleyecek ve b\u00f6ylece ekrana a\u015fa\u011f\u0131daki sonucu basacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/07\/C-9.0-Module-Initializers.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/07\/C-9.0-Module-Initializers.png\" alt=\"C# 9.0 - Module Initializers\" width=\"105\" height=\"40\" class=\"aligncenter size-full wp-image-22243\" \/><\/a><\/p>\n<p>Nihai olarak .NET, Module Initializer ile geli\u015ftiricilere uygulama aya\u011fa kald\u0131r\u0131l\u0131rken herhangi bir kodu \u00e7al\u0131\u015ft\u0131rma yetene\u011fi vermektedir. B\u00f6ylece, muhtemeldir ki daha fazla kullan\u0131m durumu ve katk\u0131s\u0131 olsa da \u015fahsen benim \u00f6ng\u00f6rebildi\u011fim do\u011frultuda \u00e7al\u0131\u015fma zaman\u0131 performans ve g\u00fcvenlik a\u00e7\u0131s\u0131ndan avantajlara sahip olabilmemizi desteklemektedir.<\/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# 9.0&#8217;\u0131n son s\u00fcr\u00fcm\u00fcnde g\u00f6ze \u00e7arpan bir \u00f6zellik olan Module Initializer&#8217;\u0131 inceliyor olaca\u011f\u0131z. Hi\u00e7 vakit kaybetmeden gelin direkt konuya sorularla giri\u015f yapal\u0131m.. Module Initializer Nedir? Module Initializer, esas\u0131nda .NET i\u00e7in yeni&#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":19209,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,3928],"tags":[3929,4354,4353],"class_list":["post-22225","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-c-9-0","tag-c-9-0","tag-c-9-0-module-initializers","tag-module-initializers"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/22225","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=22225"}],"version-history":[{"count":22,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/22225\/revisions"}],"predecessor-version":[{"id":22249,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/22225\/revisions\/22249"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/19209"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=22225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=22225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=22225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}