﻿
{"id":19185,"date":"2020-11-18T09:56:41","date_gmt":"2020-11-18T09:56:41","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=19185"},"modified":"2020-11-18T09:56:41","modified_gmt":"2020-11-18T09:56:41","slug":"c-9-0-init-only-properties-ve-init-accessor","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-9-0-init-only-properties-ve-init-accessor\/","title":{"rendered":"C# 9.0 &#8211; Init-Only Properties ve Init Accessor"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde C# 9.0 ile gelen \u00f6zelliklerimizden, herhangi bir nesnenin propertylerine ilk de\u011ferlerinin verilmesi ve sonraki s\u00fcre\u00e7te bu de\u011ferlerin de\u011fi\u015ftirilmemesini garanti alt\u0131na alan <em>Init-Only Properties<\/em> \u00f6zelli\u011fini ele al\u0131yor olaca\u011f\u0131z.<\/p>\n<p>Init-Only Properties, nesnenin sadece ilk yarat\u0131l\u0131\u015f an\u0131nda propertylerine de\u011fer atamaktad\u0131r. B\u00f6ylece, i\u015f kurallar\u0131 gere\u011fi runtime&#8217;da de\u011feri de\u011fi\u015fmemesi gereken nesneler i\u00e7in ideal bir \u00f6nlem al\u0131nmaktad\u0131r.<\/p>\n<blockquote><p><em style=\"color:purple;\">Init-Only Properties, developer a\u00e7\u0131s\u0131ndan s\u00fcre\u00e7 esnas\u0131nda de\u011fi\u015ftirilmemesi gereken property de\u011ferlerinin -yanl\u0131\u015fl\u0131kla- de\u011fi\u015ftirilmesinin \u00f6n\u00fcne ge\u00e7mekte ve b\u00f6ylece olas\u0131 hata ve bug&#8217;lardan yaz\u0131l\u0131m\u0131 ar\u0131nd\u0131rmaktad\u0131r.<\/em><\/p><\/blockquote>\n<p>Yenili\u011fi teknik olarak ele almadan \u00f6nce akl\u0131n\u0131za mevcudiyetteki getter-only-properties&#8217;lerin geldi\u011fini tahmin etmekteyim. Misal, a\u015fa\u011f\u0131daki \u00f6rnek kod blo\u011funu incelerseniz e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Book\r\n    {\r\n        public string Name { get; } = &quot;Kutsal \u0130syan&quot;;\r\n        public string Author { get; }\r\n        public Book()\r\n        {\r\n            Author = &quot;Hasan \u0130zzet Dinamo&quot;;\r\n        }\r\n    }\r\n<\/pre>\n<p>Tan\u0131mlanan propertyler sadece get olduklar\u0131ndan dolay\u0131 ya tan\u0131mland\u0131klar\u0131 anda (<span style=\"font-size:12px;\">bknz : <a target=\"_blank\" href=\"https:\/\/www.gencayyildiz.com\/blog\/c-6-0-auto-property-initializers\/\" rel=\"noopener noreferrer\">C# 6.0 \u2013 Auto Property Initializers<\/a><\/span>) ya da sadece contructor&#8217;dan de\u011fer alabilmektedirler. Aksi taktirde bu propertylere ba\u015fka bir yerden farkl\u0131 de\u011ferler set edilememektedir.<\/p>\n<p><strong>Peki yeni gelen init-only properties \u00f6zelli\u011fi ile mevcudiyetteki getter-only-properties aras\u0131nda ne gibi bir fark var?<\/strong><br \/>\nBu ikisi aras\u0131ndaki temel fark esas\u0131nda object initializer i\u015flevselli\u011finden kaynaklanmaktad\u0131r. Object initializer nedir? diye sorarsan\u0131z e\u011fer a\u015fa\u011f\u0131daki gibi bir s\u0131n\u0131ftan <em>-new-<\/em> operat\u00f6r\u00fcyle object olu\u015ftururken \u00fcretim esnas\u0131nda h\u0131zl\u0131 bir \u015fekilde propertylerinin atanmas\u0131n\u0131 sa\u011flayan s\u0131kl\u0131kla kullanmay\u0131 tercih etti\u011fimiz harika bir \u00f6zelliktir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Init-Only-Properties-ve-Init-Accessor.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Init-Only-Properties-ve-Init-Accessor.jpg\" alt=\"C# 9.0 - Init-Only Properties ve Init Accessor\" width=\"260\" height=\"111\" class=\"aligncenter size-full wp-image-19200\" \/><\/a><br \/>\n\u0130\u015fte bu \u00f6zellikten bir \u00f6nceki tasar\u0131mdaki gibi getter-only-properties \u00f6zelli\u011fi kullan\u0131ld\u0131\u011f\u0131 taktirde istifade etmemiz m\u00fcmk\u00fcn de\u011fildir. C# 9.0 ile beraber gelen init-only properties \u00f6zelli\u011fi ile constructor&#8217;a olan ba\u011f\u0131ml\u0131l\u0131k ortadan kald\u0131r\u0131larak, <em>-new-<\/em> operat\u00f6r\u00fcyle object olu\u015ftururken \u00fcretim esnas\u0131nda propertylere ilk de\u011ferleri set edilebilmekte ve b\u00f6ylece sonraki s\u00fcre\u00e7te de\u011fi\u015ftirilmesini \u00f6nleyebilmekteyiz.<\/p>\n<blockquote><p><em style=\"color:purple;\">Init-Only Properties \u00f6zelli\u011fine <span style=\"color:red;\">&#8216;init&#8217;<\/span> keyword&#8217;\u00fc e\u015flik etmektedir.<\/em><\/p><\/blockquote>\n<p>S\u00f6zgelimi;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Book\r\n    {\r\n        public string Name { get; init; } = &quot;Kutsal \u0130syan&quot;;\r\n        public string Author { get; init; }\r\n        public Book()\r\n        {\r\n            Author = &quot;Hasan \u0130zzet Dinamo&quot;;\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer, property &#8216;get&#8217; ile birlikte &#8216;init&#8217; keyword&#8217;\u00fc ile i\u015faretlenmekte ve b\u00f6ylece &#8216;object initializer&#8217; taraf\u0131ndan da ilk de\u011ferinin verilebilece\u011fi ifade edilmektedir. &#8216;init&#8217;, &#8216;get&#8217; keyword&#8217;\u00fc olmaks\u0131z\u0131n kullan\u0131lamamaktad\u0131r. Ayr\u0131ca yap\u0131s\u0131 gere\u011fi &#8216;set&#8217; ile kullan\u0131lamayaca\u011f\u0131n\u0131 da ekstradan ifade etmeye l\u00fczum olmad\u0131\u011f\u0131 kanaatindeyim. Velhas\u0131l, &#8216;get; init;&#8217; konsepti bir araya geldi\u011fi vakit hala readonly olan bu property ilk de\u011ferleri constructor yahut auto property initializers&#8217;dan alabilece\u011fi gibi &#8216;init&#8217; sayesinde object initializer&#8217;dan da alabilmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Init-Only-Properties-ve-Init-Accessor-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Init-Only-Properties-ve-Init-Accessor-1.jpg\" alt=\"C# 9.0 - Init-Only Properties ve Init Accessor\" width=\"305\" height=\"141\" class=\"aligncenter size-full wp-image-19202\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Init-Only-Properties-ve-Init-Accessor-1.jpg 305w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Init-Only-Properties-ve-Init-Accessor-1-300x139.jpg 300w\" sizes=\"auto, (max-width: 305px) 100vw, 305px\" \/><\/a><br \/>\nYukar\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi ilk de\u011ferler verildikten sonra yeni bir de\u011fer atanmaya \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda derleyici hatas\u0131yla kar\u015f\u0131la\u015f\u0131lmakta ve b\u00f6ylece developer uyar\u0131lmaktad\u0131r.<\/p>\n<p>Ayr\u0131ca getter-only-properties ile \u00e7al\u0131\u015fmaktansa readonly bir field \u00fczerinde i\u015flem yapmam\u0131z gerekiyorsa e\u011fer a\u015fa\u011f\u0131daki gibi &#8216;init&#8217; bizlere e\u015flik edebilmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Book\r\n    {\r\n        private readonly string name;\r\n        private readonly string author;\r\n        public string Name\r\n        {\r\n            get =&gt; name;\r\n            init =&gt; name = value;\r\n        }\r\n        public string Author\r\n        {\r\n            get =&gt; author;\r\n            init =&gt; author = value;\r\n        }\r\n    }\r\n<\/pre>\n<p>B\u00f6ylece C# 9.0 yeniliklerinden olan Init-Only Properties sayesinde, nesnelerin ilk yarat\u0131l\u0131\u015f esnas\u0131nda salt okunabilir de\u011ferlerini vermek i\u00e7in var olan ba\u015fka bir tekni\u011fi(object initializer) bloklamadan kullanabilmekteyiz. 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# 9.0 ile gelen \u00f6zelliklerimizden, herhangi bir nesnenin propertylerine ilk de\u011ferlerinin verilmesi ve sonraki s\u00fcre\u00e7te bu de\u011ferlerin de\u011fi\u015ftirilmemesini garanti alt\u0131na alan Init-Only Properties \u00f6zelli\u011fini ele al\u0131yor olaca\u011f\u0131z. Init-Only Properties, nesnenin sadece&#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":[3928],"tags":[3929,3933,3932,3931,3930],"class_list":["post-19185","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-9-0","tag-c-9-0","tag-c-9-0-init-accessor","tag-c-9-0-init-only-properties","tag-init-accessor","tag-init-only-properties"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19185","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=19185"}],"version-history":[{"count":21,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19185\/revisions"}],"predecessor-version":[{"id":19208,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19185\/revisions\/19208"}],"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=19185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=19185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=19185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}