﻿
{"id":19214,"date":"2020-11-20T18:21:35","date_gmt":"2020-11-20T18:21:35","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=19214"},"modified":"2020-11-20T18:21:35","modified_gmt":"2020-11-20T18:21:35","slug":"c-9-0-records-ile-immutable-datalar","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-9-0-records-ile-immutable-datalar\/","title":{"rendered":"C# 9.0 &#8211; Records \u0130le Immutable Datalar"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Hani bazen gelen yenilik, var olan k\u00fc\u00e7\u00fck bir gedi\u011fi kapatmak i\u00e7in yap\u0131lan bir onar\u0131mdan yahut iyi ya da k\u00f6t\u00fc bir de\u011fi\u015fiklikten ibaret olabilmektedir. Lakin baz\u0131lar\u0131 vard\u0131r ki, hangi olgu \u00fczerinde olursa olsun bir geli\u015fimdir, ileriye d\u00f6n\u00fckt\u00fcr, faydal\u0131d\u0131r ve mevcudiyete bir de\u011fer katand\u0131r. \u0130\u015fte&#8230; C# 9.0 ile gelen ve yenilikten \u00f6te, dile ayr\u0131 bir de\u011fer katan, geli\u015fimsel olarak ileriye ta\u015f\u0131yan Records \u00f6zelli\u011fiyle tan\u0131\u015fmaktay\u0131z. Bu i\u00e7eri\u011fimizde bu \u00f6zellik \u00fczerine isti\u015farelerimizi edecek ve t\u00fcm detaylar\u0131yla konuyu irdeliyor olaca\u011f\u0131z.<\/p>\n<h3 style=\"color:#e83e8c;\">Records Nedir?<\/h3>\n<p>C# 9.0&#8217;da gelen ve bir \u00f6nceki <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-9-0-init-only-properties-ve-init-accessor\/\" rel=\"noopener noreferrer\" target=\"_blank\">Init-Only Properties ve Init Accessor<\/a> ba\u015fl\u0131kl\u0131 makalemde ele ald\u0131\u011f\u0131m\u0131z konuda k\u0131saca &#8216;init&#8217; keyword&#8217;\u00fcn\u00fc ele alm\u0131\u015f ve nesne \u00fcretim esnas\u0131n\u0131n d\u0131\u015f\u0131nda de\u011fi\u015fmez de\u011ferler olu\u015fturulmas\u0131 i\u00e7in constructer ve auto property initializers yap\u0131s\u0131n\u0131n yan\u0131nda object initializer yap\u0131s\u0131n\u0131nda nas\u0131l kullan\u0131labilir hale getirildi\u011fini incelemi\u015ftik. \u0130lgili makaledeki konuda sabitlik sadece tek bir property \u00fczerinde ama\u00e7 edinilmektedir. E\u011fer ki bir objeyi b\u00fct\u00fcnsel olarak de\u011fi\u015fmez yapmak istiyorsak o zaman daha fazlas\u0131na ihtiyac\u0131m\u0131z olacakt\u0131r. \u0130\u015fte bu ihtiyaca istinaden <em>Records<\/em> geli\u015ftirilmi\u015ftir.<\/p>\n<p>Record, bir objenin topyek\u00fcn olarak sabit\/de\u011fi\u015fmez olarak kalmas\u0131n\u0131 sa\u011flamakta ve bu durumu g\u00fcvence alt\u0131na almaktad\u0131r. B\u00f6ylece bu obje, art\u0131k de\u011feri de\u011fi\u015fmeyece\u011finden dolay\u0131 esas\u0131nda objeden ziyade bir de\u011fer g\u00f6z\u00fcyle bak\u0131lan bir yap\u0131ya d\u00f6n\u00fc\u015fmektedir. Buradan yola \u00e7\u0131karak, record&#8217;lar\u0131 i\u00e7erisinde data bar\u0131nd\u0131ran lightweight(hafif) class&#8217;lar olarak de\u011ferlendirebiliriz. Record&#8217;lar, class&#8217;lara istinaden objeden ziyade i\u00e7erisinde bulunan datalar\u0131 sabitleyerek varl\u0131\u011f\u0131na nazaran verilerini\/datalar\u0131n\u0131 \u00f6ne \u00e7\u0131karmakta ve b\u00f6ylece biz yaz\u0131l\u0131mc\u0131lar a\u00e7\u0131s\u0131ndan bir n\u00fcans sa\u011flamaktad\u0131r. Biliyorum&#8230; Buradaki anlat\u0131m zihninizde tam kar\u015f\u0131l\u0131k bulmam\u0131\u015f olabilir. Bunun i\u00e7in a\u015fa\u011f\u0131daki \u015femalar\u0131 inceleyerek class ve record aras\u0131nda ayr\u0131m\u0131 g\u00f6zetmemiz anlamland\u0131rmam\u0131z i\u00e7in olduk\u00e7a faydal\u0131 olacakt\u0131r.<\/p>\n<table>\n<thead>\n<tr>\n<th>class<\/th>\n<th>record<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records.jpg\" alt=\"C# 9.0 - Records\" width=\"792\" height=\"212\" class=\"aligncenter size-full wp-image-19225\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records.jpg 792w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-300x80.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-768x206.jpg 768w\" sizes=\"auto, (max-width: 792px) 100vw, 792px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-1.jpg\" alt=\"C# 9.0 - Records\" width=\"921\" height=\"214\" class=\"aligncenter size-full wp-image-19227\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-1.jpg 921w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-1-300x70.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-1-768x178.jpg 768w\" sizes=\"auto, (max-width: 921px) 100vw, 921px\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td>Class&#8217;lar da verisel olarak nesne \u00f6n plandad\u0131r ve her bir farkl\u0131 referansa sahip olan nesne farkl\u0131 de\u011fer olarak alg\u0131lanmaktad\u0131r.<br \/>\nDolay\u0131s\u0131yla <code style=\"font-size:15px;color:green;\">Equals(x, y)<\/code> kar\u015f\u0131la\u015ft\u0131rmas\u0131 yanl\u0131\u015ft\u0131r.<\/td>\n<td>Record&#8217;lar ise verisel olarak de\u011feri \u00f6n planda tutmaktad\u0131r. Sadece nesnel olarak bu veriler bir objede tutulmakta lakin de\u011fi\u015ftirilememektedir.<br \/>\nHaliyle farkl\u0131 objelerde de olsa, veriler(property de\u011ferleri) ayn\u0131 oldu\u011fu s\u00fcrece <code style=\"font-size:15px;color:green;\">Equals(x, y)<\/code> \u00f6nermesi do\u011fru olacakt\u0131r.\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\">\nHer iki t\u00fcrl\u00fcde veriler bir objede tutulmakta, lakin record&#8217;lar class&#8217;lara nazaran, bir objeden ziyade topyek\u00fcn veri imaj\u0131nda olacak \u015fekilde spesifik bir davran\u0131\u015f sergilemektedirler.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote><p><em style=\"color:green;\">Record, compile \u00e7\u0131kt\u0131s\u0131 olarak IEquatable&lt;T&gt;&#8217;i implemente eden bir s\u0131n\u0131fa d\u00f6n\u00fc\u015fmektedir. B\u00f6ylece record \u00fczerinden yarat\u0131lacak nesneler aralar\u0131nda kar\u015f\u0131la\u015ft\u0131r\u0131ld\u0131klar\u0131nda referans olarak de\u011fil, verisel olarak de\u011ferlendirilir.<\/em><\/p><\/blockquote>\n<h3 style=\"color:#e83e8c;\">Records Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>Record&#8217;lar, t\u0131pk\u0131 bir class, interface, struct tan\u0131mlamas\u0131nda oldu\u011fu gibi benzer iskelette bir syntax ile olu\u015fturulmaktad\u0131rlar.<\/p>\n<p>Prototip olarak a\u015fa\u011f\u0131daki gibidir;<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nrecord &#x5B;Name]\r\n{\r\n\r\n}\r\n<\/pre>\n<p>\u00d6rnek vermemiz gerekirse e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public record Book\r\n    {\r\n        public string Name { get; init; }\r\n        public string Author { get; init; }\r\n    }\r\n<\/pre>\n<p>\u015feklinde tan\u0131mlanmaktad\u0131r.<\/p>\n<blockquote><p><em style=\"color:orange;\">Bu \u015fekilde tan\u0131mlanan record&#8217;lara <u>norminal records<\/u> denmektedir. Ayriyetten i\u00e7eri\u011fimizin devam\u0131nda <u>positional records<\/u>&#8216;lar\u0131n oldu\u011funuda g\u00f6rece\u011fiz.<\/em><\/p><\/blockquote>\n<h3 style=\"color:purple;\">Records \u0130le Class Aras\u0131nda Fark Kriti\u011fi Yapal\u0131m!<\/h3>\n<p>Yukar\u0131da Records Nedir? ba\u015fl\u0131\u011f\u0131 alt\u0131nda record ile class aras\u0131ndaki farklardan bahsetmi\u015f ve bunu m\u00fcmk\u00fcn mertebe g\u00f6rselle\u015ftirmi\u015ftik. Lakin \u015fimdi record ile class arars\u0131nda pratiksel a\u00e7\u0131dan farklara de\u011finece\u011fiz.<\/p>\n<p>Record&#8217;lar de\u011fi\u015ftirilemez objeler olu\u015fturmam\u0131z\u0131 sa\u011flamaktad\u0131rlar demi\u015ftik. <em>Peki bu de\u011fi\u015ftirilemez objeleri class&#8217;lar ile ger\u00e7ekle\u015ftiremez miyiz?<\/em> Gelin deneyelim. <\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Employee\r\n    {\r\n        public string Name { get; init; }\r\n        public string Surname { get; init; }\r\n        public int Position { get; init; }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki class tan\u0131mlamas\u0131n\u0131 incelerseniz e\u011fer i\u00e7erisindeki t\u00fcm propertyler &#8216;init&#8217; oldu\u011fundan dolay\u0131 a\u015fa\u011f\u0131daki gibi sadece \u00fcretim esnas\u0131nda ilk de\u011ferlerini alabilmektedirler.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Employee employee1 = new Employee\r\n            {\r\n                Name = &quot;Gen\u00e7ay&quot;,\r\n                Surname = &quot;Y\u0131ld\u0131z&quot;,\r\n                Position = 1\r\n            };\r\n<\/pre>\n<p>Dolay\u0131s\u0131yla burada pratiksel a\u00e7\u0131dan class&#8217;lar\u0131n, record&#8217;lardan pekte bir fark\u0131n\u0131n olmad\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Pe\u015fin h\u00fckme varmadan, aceleye getirmeden sakince \u00f6rneklendirmeye devam edelim. D\u00fc\u015f\u00fcnelim ki, bu nesnenin s\u00fcre\u00e7te herhangi bir property de\u011ferini de\u011fi\u015ftirmek istedi\u011fimizde bunu ger\u00e7ekle\u015ftirebilmek i\u00e7in a\u015fa\u011f\u0131daki gibi yeni bir Employee nesnesi \u00fcretmemiz ve de\u011fi\u015fikli\u011fin yap\u0131laca\u011f\u0131 property d\u0131\u015f\u0131nda di\u011fer property&#8217;leri e\u015fle\u015ftirmemiz gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Employee employee1 = new Employee\r\n            {\r\n                Name = &quot;Gen\u00e7ay&quot;,\r\n                Surname = &quot;Y\u0131ld\u0131z&quot;,\r\n                Position = 1\r\n            };\r\n\r\n            Employee employee2 = new Employee\r\n            {\r\n                Name = employee1.Name,\r\n                Surname = employee1.Surname,\r\n                Position = 2\r\n            };\r\n<\/pre>\n<p>Bu y\u00f6ntemin, adil say\u0131dan fazla property&#8217;e sahip olundu\u011fu durumlarda can s\u0131k\u0131c\u0131 hale gelece\u011fi a\u015fikar olsa gerek. Ne kadar \u00e7ok property o kadar zor ve maliyetli kod demektir. Elbette reflection veya serialization ile kopyalama mant\u0131klar\u0131 uygulanabilir yahut bir auto-mapping k\u00fct\u00fcphanesi kullan\u0131labilir. Ancak bu tarz bir durumda C# 9.0 ile gelen Records yap\u0131lanmas\u0131yla \u00e7al\u0131\u015f\u0131lmas\u0131 en do\u011fru y\u00f6ntem olacakt\u0131r.<\/p>\n<p>E\u011fer ki biz, Employee s\u0131n\u0131f\u0131n\u0131 a\u015fa\u011f\u0131daki gibi record olarak tasarlarsak;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public record Employee\r\n    {\r\n        public string Name { get; init; }\r\n        public string Surname { get; init; }\r\n        public int Position { get; init; }\r\n    }\r\n<\/pre>\n<p>bu record&#8217;dan \u00fcretilen nesnelere de\u011fi\u015fmez bir veri misali davran\u0131lmas\u0131n\u0131 istedi\u011fimizi bildirmi\u015f olaca\u011f\u0131z. Dolay\u0131s\u0131yla record nesnesinde bir de\u011fi\u015fiklik yap\u0131lmak istendi\u011finde;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Employee employee1 = new Employee\r\n            {\r\n                Name = &quot;Gen\u00e7ay&quot;,\r\n                Surname = &quot;Y\u0131ld\u0131z&quot;,\r\n                Position = 1\r\n            };\r\n\r\n            Employee employee2 = new Employee\r\n            {\r\n                Name = employee1.Name,\r\n                Surname = employee1.Surname,\r\n                Position = 2\r\n            };\r\n<\/pre>\n<p>\u015feklinde class&#8217;lar da oldu\u011fu gibi manuel bir yakla\u015f\u0131mla ilgili nesneyi kopyalamak ve sadece istenilen de\u011feri farkl\u0131 k\u0131lmak m\u00fcmk\u00fcnd\u00fcr. Lakin b\u00f6yle bir ihtiyaca istinaden record yap\u0131lanmas\u0131 &#8216;<strong style=\"color:red;\">with<\/strong>&#8216; komutu ile h\u0131zl\u0131ca ilgili nesneyi kopyalamam\u0131z\u0131 ve istenilen \u00f6zelli\u011finin de\u011fi\u015ftirilebilmesini sa\u011flamaktad\u0131r. <\/p>\n<h5 style=\"color:red;\">with Expressions<\/h5>\n<p>Immutable t\u00fcrlerde \u00e7al\u0131\u015f\u0131rken nesne \u00fczerinde de\u011fi\u015fiklik yapabilmek i\u00e7in ilgili nesneyi ya \u00e7o\u011faltmam\u0131z\/klonlamam\u0131z(deep copy) ve \u00fczerinde de\u011fi\u015fiklik yapmam\u0131z gerekmekte ya da yukar\u0131da yapt\u0131\u011f\u0131m\u0131z gibi yeni bir nesne \u00fcretip mevcut nesnedeki de\u011ferleri, de\u011fi\u015fikli\u011fi yans\u0131t\u0131lacak \u015fekilde aktarmam\u0131z gerekmektedir. <\/p>\n<blockquote><p><em style=\"color:orange;\">Immutable tiplerde nesne \u00fczerinde yap\u0131lacak de\u011fi\u015fiklik i\u00e7in yeni bir nesne \u00fcretilmesinin gereklili\u011fini, string \u00fczerinde yap\u0131lan de\u011fi\u015fikli\u011fin yeni bir string yarat\u0131lmas\u0131n\u0131 gerektirmesiyle \u00f6rneklendirebiliriz&#8230;<\/em><\/p><\/blockquote>\n<p>Burada &#8216;With&#8217; metotlar\u0131 olu\u015fturup probleme k\u0131smi bir kolayl\u0131kta \u00e7\u00f6z\u00fcm getirebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Employee\r\n    {\r\n        public string Name { get; init; }\r\n        public string Surname { get; init; }\r\n        public int? Position { get; init; }\r\n\r\n        public Employee With(int position)\r\n        {\r\n            return new Employee\r\n            {\r\n                Name = this.Name,\r\n                Surname = this.Surname,\r\n                Position = position\r\n            };\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130lgili &#8216;With&#8217; metodu yeni bir nesne \u00fcretiminden sorumlu olmakta ve sadece de\u011fi\u015fiklik olacak property&#8217;e odaklanmaktad\u0131r. Kullan\u0131m\u0131 ise a\u015fa\u011f\u0131daki gibidir;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Employee employee1 = new Employee\r\n            {\r\n                Name = &quot;Gen\u00e7ay&quot;,\r\n                Surname = &quot;Y\u0131ld\u0131z&quot;,\r\n                Position = 1\r\n            };\r\n\r\n            Employee employee2 = employee1.With(2);\r\n<\/pre>\n<p>Evet, immutable olan bir t\u00fcrde nesneyi t\u00fcreterek k\u0131smi de\u011fi\u015fiklik yapt\u0131k yapmas\u0131na ama &#8216;With&#8217; metodunu yazmak her zaman bu kadar kolay olmayacakt\u0131r. Bunun i\u00e7in C# 9.0&#8217;da record&#8217;lar i\u00e7in gelen with expressions&#8217;lar, &#8216;With&#8217; metodu yazmaktan bizleri kurtarmakta ve daha spesifik \u00e7\u00f6z\u00fcm getirmemizi sa\u011flamaktad\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public record Employee\r\n    {\r\n        public string Name { get; init; }\r\n        public string Surname { get; init; }\r\n        public int? Position { get; init; }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Employee employee1 = new Employee\r\n            {\r\n                Name = &quot;Gen\u00e7ay&quot;,\r\n                Surname = &quot;Y\u0131ld\u0131z&quot;,\r\n                Position = 1\r\n            };\r\n\r\n            Employee employee2 = employee1 with { Position = 2 };\r\n            Employee employee3 = employee1 with { Name = &quot;Hilmi&quot;, Position = 2 };\r\n            Employee employee4 = employee2 with { Name = &quot;R\u0131fk\u0131&quot;, Position = 5 };\r\n<\/pre>\n<p><code>with<\/code> komutu daha etkili bir \u015fekilde yeni nesne olu\u015fturmak i\u00e7in olanak sa\u011flar. Bu kod, kendisinden \u00f6nceki kodlarla ayn\u0131 sonucu getiriyor olsa da i\u015flevsel a\u00e7\u0131dan pratik ve kod maliyeti a\u00e7\u0131s\u0131ndan olduk\u00e7a d\u00fc\u015f\u00fckt\u00fcr.<\/p>\n<h5 style=\"color:red;\">Positional Records<\/h5>\n<p>Norminal record&#8217;lar object initializer&#8217;lar ile initialize edilebildi\u011fi gibi positional record&#8217;lar da ise constructor ve <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-7-0-deconstruct-metodu\/\" rel=\"noopener noreferrer\" target=\"_blank\">deconstructor<\/a> kullan\u0131m\u0131na izin verilmektedir.<\/p>\n<p>Normalde record&#8217;lar yap\u0131sal olarak class&#8217;lar gibi constructor ve deconstructor alabilmektedirler. Lakin Positional Records bu manuel tan\u0131mlamalardan ziyade daha fazlas\u0131n\u0131 ifade etmektedir. \u015eimdi gelin \u00f6nce bildi\u011fimiz y\u00f6ntemle constructor ve deconstructor tan\u0131mlayal\u0131m.<br \/>\n<u style=\"color:green;\"><strong>Eski Y\u00f6ntem<\/strong><\/u>;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public record Employee\r\n    {\r\n        \/\/Constructor\r\n        public Employee(string name, string surname)\r\n            =&gt; (Name, Surname) = (name, surname);\r\n\r\n        \/\/Deconstructor\r\n        public void Deconstruct(out string name, out string surname)\r\n            =&gt; (name, surname) = (Name, Surname);\r\n\r\n        public string Name { get; set; }\r\n        public string Surname { get; set; }\r\n        public int Position { get; set; }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Employee employee = new Employee(&quot;Gen\u00e7ay&quot;, &quot;Y\u0131ld\u0131z&quot;)\r\n            {\r\n                Position = 1\r\n            };\r\n\r\n            var (Name, Surname) = employee;\r\n<\/pre>\n<p><u style=\"color:green;\"><strong>Yeni Y\u00f6ntem<\/strong><\/u>;<br \/>\nYeni y\u00f6ntem bu konuda olduk\u00e7a pratik bir \u00e7\u00f6z\u00fcm getirmi\u015ftir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public record Employee(string Name, string Surname)\r\n    {\r\n        public int Position { get; set; }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere direkt olarak record tan\u0131mlamas\u0131n\u0131n yan\u0131nda parantezler ile constructor misali obje i\u00e7erisindeki ilgili property&#8217;ler tan\u0131mlanmaktad\u0131r. Bu property&#8217;ler default &#8216;init&#8217; olacak \u015fekilde olu\u015fturulmakta ve nesne \u00fcretimi esnas\u0131nda constructor&#8217;dan verilecek de\u011ferlerden sonra readonly olarak kullan\u0131lmaktad\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-2.jpg\" alt=\"C# 9.0 - Records\" width=\"424\" height=\"163\" class=\"aligncenter size-full wp-image-19271\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-2.jpg 424w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-2-300x115.jpg 300w\" sizes=\"auto, (max-width: 424px) 100vw, 424px\" \/><\/a><\/p>\n<p>Ayr\u0131ca a\u015fa\u011f\u0131daki varyasyonda da bir positional record tan\u0131mlanabilmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public record Employee(string name, string surname)\r\n    {\r\n        public string Name =&gt; name;\r\n        public string Surname =&gt; surname;\r\n        public int Position { get; set; }\r\n    }\r\n<\/pre>\n<p>Bu varyasonu de\u011ferlendirdi\u011fimizde \u015fahsen ben ilk \u00f6rneklendirmedekini tercih etmekteyim \ud83d\ude42<\/p>\n<h3 style=\"color:#e83e8c;\">Records ve Inheritance?<\/h3>\n<p>Yeni gelen record&#8217;lar da inheritance deste\u011fide bulunmaktad\u0131r. Hemen \u00f6rneklendirmemiz gerekirse e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public record Car\r\n    {\r\n        public string Name { get; init; }\r\n        public string Model { get; init; }\r\n    }\r\n    public record SportCar : Car\r\n    {\r\n        public int MaxPower { get; init; }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere record&#8217;lar da klasik : operat\u00f6r\u00fc ile kal\u0131t\u0131m al\u0131nabilmektedir. E\u011fer ki kal\u0131t\u0131m veren record t\u00fcr\u00fc positional ise;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public record Car(string Name, string Model)\r\n    {\r\n\r\n    }\r\n    public record SportCar : Car\r\n    {\r\n        public SportCar() : base(&quot;X&quot;, &quot;Y&quot;)\r\n        {\r\n\r\n        }\r\n        public int MaxPower { get; init; }\r\n    }\r\n<\/pre>\n<p>base record&#8217;a derived record&#8217;dan ilgili datalar\u0131 g\u00f6ndermek kayd\u0131yla kal\u0131t\u0131m ger\u00e7ekle\u015ftirilebilir. Lakin tam tersi olarak norminal record, positional record&#8217;a kal\u0131t\u0131m verirse herhangi bir ayara gerek kalmaks\u0131z\u0131n bu i\u015flem a\u015fa\u011f\u0131daki gibi ger\u00e7ekle\u015ftirilebilmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public record Car\r\n    {\r\n        public string Name { get; init; }\r\n        public string Model { get; init; }\r\n    }\r\n    public record SportCar(int MaxPower) : Car\r\n    {\r\n\r\n    }\r\n<\/pre>\n<p>T\u00fcm bunlar\u0131n d\u0131\u015f\u0131nda positional record, bir ba\u015fka positional record&#8217;a kal\u0131t\u0131m verememektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-3.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-3.jpg\" alt=\"C# 9.0 - Records\" width=\"370\" height=\"208\" class=\"aligncenter size-full wp-image-19277\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-3.jpg 370w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-3-300x169.jpg 300w\" sizes=\"auto, (max-width: 370px) 100vw, 370px\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;SportCar&#8217; record&#8217;\u0131, base record olan &#8216;Car&#8217;a ilgili constructor de\u011ferlerini g\u00f6nderebilmek i\u00e7in kendisi yeni bir constructor olu\u015fturmak zorunda kalmakta ve bir tutars\u0131zl\u0131k ortaya \u00e7\u0131kmaktad\u0131r. Madem biz constructor olu\u015fturacakt\u0131k o halde &#8216;MaxPower&#8217; parametresini direkt constructor&#8217;da tan\u0131mlard\u0131k! \u00d6yle de\u011fil mi?&#8230;<\/p>\n<p>Velhas\u0131l, \u00f6rneklerde oldu\u011fu \u015fekilde aralar\u0131nda kal\u0131t\u0131msal ili\u015fki olan record nesnelerini with expression ile yeniden klonlamak istiyorsak e\u011fer bunu a\u015fa\u011f\u0131daki gibi rahatl\u0131kla ger\u00e7ekle\u015ftirebiliriz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-4.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-4.jpg\" alt=\"C# 9.0 - Records\" width=\"543\" height=\"235\" class=\"aligncenter size-full wp-image-19280\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-4.jpg 543w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-4-300x130.jpg 300w\" sizes=\"auto, (max-width: 543px) 100vw, 543px\" \/><\/a><br \/>\nBiz her ne kadar &#8216;Car&#8217; referans\u0131 \u00fczerinden bu objeyi with ile t\u00fcretsekte compiler arkaplanda &#8216;Clone&#8217; fonksiyonunu kulland\u0131\u011f\u0131 i\u00e7in yeni bir &#8216;SportCar&#8217; \u00fcretmekte ve tip bilgisini kaybetmeksizin var olan verilerle de\u011fi\u015fiklikleri yakalayabilmektedir. Dolay\u0131s\u0131yla &#8216;MaxPower&#8217; gelmektedir.<\/p>\n<h3 style=\"color:#e83e8c;\">Record Objects Comparison Equals\/ReferenceEquals<\/h3>\n<p>Record&#8217;lar\u0131n, farkl\u0131 referanslarla i\u015faretlenmi\u015f nesneleri olsa dahi ta\u015f\u0131d\u0131klar\u0131 veriler ayn\u0131 oldu\u011fu s\u00fcrece <code style=\"color:green;\">Equals(x, y)<\/code> kar\u015f\u0131la\u015ft\u0131rmas\u0131n\u0131 do\u011frulayaca\u011f\u0131ndan bahsetmi\u015ftik.<\/p>\n<p>\u015eimdi gelin bunu == operat\u00f6r\u00fc e\u015fli\u011finde hem &#8216;Equals&#8217; hemde &#8216;ReferenceEquals&#8217; metotlar\u0131yla test edelim;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Car car1 = new SportCar()\r\n            {\r\n                Name = &quot;X&quot;,\r\n                Model = &quot;Y&quot;,\r\n                MaxPower = 1000\r\n            };\r\n\r\n            Car car2 = car1 with { };\r\n            Car car3 = car1 with { Model = &quot;Z&quot; };\r\n\r\n            Console.WriteLine($&quot; car1 == car2 {car1 == car2}&quot;);\r\n            Console.WriteLine($&quot; car1 == car3 {car1 == car3}&quot;);\r\n            Console.WriteLine($&quot; car2 == car3 {car2 == car3}&quot;);\r\n\r\n            Console.WriteLine($&quot; Equals(car1, car2) {Equals(car1, car2)}&quot;);\r\n            Console.WriteLine($&quot; Equals(car1, car3) {Equals(car1, car3)}&quot;);\r\n            Console.WriteLine($&quot; Equals(car2, car3) {Equals(car2, car3)}&quot;);\r\n\r\n            Console.WriteLine($&quot; ReferenceEquals(car1, car2) {ReferenceEquals(car1, car2)}&quot;);\r\n            Console.WriteLine($&quot; ReferenceEquals(car1, car3) {ReferenceEquals(car1, car3)}&quot;);\r\n            Console.WriteLine($&quot; ReferenceEquals(car2, car3) {ReferenceEquals(car2, car3)}&quot;);\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-5.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-5.jpg\" alt=\"C# 9.0 - Records\" width=\"273\" height=\"146\" class=\"aligncenter size-full wp-image-19292\" \/><\/a><\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere record&#8217;lar &#8216;Equals&#8217; kar\u015f\u0131la\u015ft\u0131rmas\u0131nda veriyi \u00f6n planda tutmakta, aksi taktirde &#8216;ReferenceEquals&#8217; nesneler farkl\u0131 referanslarda oldu\u011fu i\u00e7in false de\u011ferini d\u00f6nd\u00fcrmektedir.<\/p>\n<h3 style=\"color:#e83e8c;\">Generic Yap\u0131lanmalarda Record<\/h3>\n<p>Record&#8217;lar her ne kadar farkl\u0131 bir olguymu\u015f gibi g\u00f6z\u00fckse de esas\u0131nda bir class olduklar\u0131ndan dolay\u0131 generic yap\u0131lanmalarda bir base class constraint olarak bildirilememektedirler.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-6.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-6.jpg\" alt=\"C# 9.0 - Records\" width=\"282\" height=\"82\" class=\"aligncenter size-full wp-image-19295\" \/><\/a><br \/>\nLakin ihtiyaca binaen a\u015fa\u011f\u0131daki gibi direkt class yerine kullan\u0131labilirler.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-7.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-7.jpg\" alt=\"C# 9.0 - Records\" width=\"498\" height=\"363\" class=\"aligncenter size-full wp-image-19299\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-7.jpg 498w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/C-9.0-Records-7-300x219.jpg 300w\" sizes=\"auto, (max-width: 498px) 100vw, 498px\" \/><\/a><\/p>\n<p><strong>Sonu\u00e7<\/strong><br \/>\nBu g\u00fczel ve performans a\u00e7\u0131s\u0131ndan y\u00fcksek dereceli getirisi olan record \u00f6zelli\u011fi hakk\u0131nda nihai olarak denebilecek pek bir \u015fey oldu\u011funu d\u00fc\u015f\u00fcnmemekteyim. Sadece bu ve bunun gibi yenilikler sayesinde, her ge\u00e7en g\u00fcn milyonlarca insan\u0131n kulland\u0131\u011f\u0131 T\u00fcrk\u00e7e&#8217;mizin bile bozulmaya ve yozla\u015fmaya y\u00fcz tuttu\u011fu \u015fu d\u00fcnyada bir programlama dilinin bu derece nazik at\u0131l\u0131mlar yapmas\u0131 ve daha da \u00f6nemlisi kendisini geli\u015ftirmek ve alan\u0131nda her \u015feyi tarif edebilir hale gelebilmek i\u00e7in \u00e7abalamas\u0131 ve ona g\u00f6re tasarlanmas\u0131, gelece\u011fin bu dilleri bilenlerin d\u00fcnyas\u0131 oldu\u011funun bir yans\u0131mas\u0131 oldu\u011funu g\u00f6stermekte, bizlerinde buna \u015fahit oldu\u011fu d\u00fc\u015f\u00fcncesindeyim.<\/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, Hani bazen gelen yenilik, var olan k\u00fc\u00e7\u00fck bir gedi\u011fi kapatmak i\u00e7in yap\u0131lan bir onar\u0131mdan yahut iyi ya da k\u00f6t\u00fc bir de\u011fi\u015fiklikten ibaret olabilmektedir. Lakin baz\u0131lar\u0131 vard\u0131r ki, hangi olgu \u00fczerinde olursa olsun bir&#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":[12,3928],"tags":[3929,3940,3941,3934,3943,3937,3936,1011,3945,3942,3938,3935,3939,3944],"class_list":["post-19214","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-9-0","tag-c-9-0","tag-c-9-0-norminal-records","tag-c-9-0-positional-records","tag-c-9-0-records","tag-c-9-0-referenceequals","tag-c-with-method","tag-c-with-metotlari","tag-equals","tag-equals-vs-referenceequals","tag-norminal-records","tag-positional-records","tag-records","tag-records-with-expressions","tag-referenceequals"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19214","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=19214"}],"version-history":[{"count":78,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19214\/revisions"}],"predecessor-version":[{"id":19303,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19214\/revisions\/19303"}],"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=19214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=19214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=19214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}