{"id":31851,"date":"2025-10-14T21:31:33","date_gmt":"2025-10-14T18:31:33","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/"},"modified":"2025-10-14T21:31:33","modified_gmt":"2025-10-14T18:31:33","slug":"c-record-class-ve-struct-kapsamli-rehber-ve-farklar","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/","title":{"rendered":"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar"},"content":{"rendered":"<p><body><\/p>\n<style>\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            line-height: 1.7;\n            color: #333;\n            max-width: 900px;\n            margin: 0 auto;\n            padding: 20px;\n            background-color: #f9f9f9;\n        }<\/p>\n<p>        h2 {\n            color: #2c3e50;\n            margin-top: 35px;\n            margin-bottom: 20px;\n            padding-bottom: 10px;\n            border-bottom: 2px solid #3498db;\n            font-size: 1.8em;\n        }<\/p>\n<p>        h3 {\n            color: #34495e;\n            margin-top: 30px;\n            margin-bottom: 15px;\n            font-size: 1.4em;\n        }<\/p>\n<p>        p {\n            margin-bottom: 15px;\n        }<\/p>\n<p>        pre {\n            background-color: #ecf0f1;\n            padding: 15px;\n            border-radius: 8px;\n            overflow-x: auto;\n            font-family: 'Consolas', 'Courier New', monospace;\n            font-size: 0.95em;\n            line-height: 1.5;\n            margin-bottom: 20px;\n        }<\/p>\n<p>        code {\n            font-family: 'Consolas', 'Courier New', monospace;\n            background-color: #e0e6e7;\n            padding: 2px 4px;\n            border-radius: 4px;\n        }<\/p>\n<p>        ul,\n        ol {\n            margin-bottom: 15px;\n            padding-left: 25px;\n        }<\/p>\n<p>        li {\n            margin-bottom: 8px;\n        }<\/p>\n<p>        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin-bottom: 20px;\n        }<\/p>\n<p>        th,\n        td {\n            border: 1px solid #ddd;\n            padding: 10px;\n            text-align: left;\n        }<\/p>\n<p>        th {\n            background-color: #f2f2f2;\n            font-weight: bold;\n        }<\/p>\n<p>        .expert-tip {\n            background-color: #e8f6f3;\n            border-left: 5px solid #1abc9c;\n            padding: 15px;\n            margin: 20px 0;\n            border-radius: 5px;\n            font-style: italic;\n            color: #27ae60;\n        }<\/p>\n<p>        \/* Mobil Uyumlu Tasar\u0131m \u0130\u00e7in Media Query *\/\n        @media (max-width: 768px) {\n            body {\n                padding: 15px;\n            }<\/p>\n<p>            h2 {\n                font-size: 1.5em;\n            }<\/p>\n<p>            h3 {\n                font-size: 1.2em;\n            }<\/p>\n<p>            table,\n            thead,\n            tbody,\n            th,\n            td,\n            tr {\n                display: block;\n            }<\/p>\n<p>            thead tr {\n                position: absolute;\n                top: -9999px;\n                left: -9999px;\n            }<\/p>\n<p>            tr {\n                margin-bottom: 15px;\n            }<\/p>\n<p>            td {\n                border: none;\n                border-bottom: 1px solid #eee;\n                position: relative;\n                padding-left: 50%;\n                text-align: right;\n            }<\/p>\n<p>            td:before {\n                position: absolute;\n                top: 6px;\n                left: 6px;\n                width: 45%;\n                padding-right: 10px;\n                white-space: nowrap;\n                text-align: left;\n                font-weight: bold;\n            }<\/p>\n<p>            \/* Etiketleri belirlemek i\u00e7in *\/\n            td:nth-of-type(1):before {\n                content: \"\u00d6zellik\";\n            }<\/p>\n<p>            td:nth-of-type(2):before {\n                content: \"Class\";\n            }<\/p>\n<p>            td:nth-of-type(3):before {\n                content: \"Struct\";\n            }<\/p>\n<p>            td:nth-of-type(4):before {\n                content: \"Record\";\n            }\n        }\n    <\/style>\n<p>C# geli\u015ftiricileri i\u00e7in Record, Class ve Struct aras\u0131ndaki temel farklar\u0131, ne zaman hangisini kullanman\u0131z gerekti\u011fini ve performans ipu\u00e7lar\u0131n\u0131 bu kapsaml\u0131 rehberde ke\u015ffedin. Bu \u00fc\u00e7 farkl\u0131 veri modelleme yakla\u015f\u0131m\u0131, uygulaman\u0131z\u0131n performans\u0131n\u0131, bellek kullan\u0131m\u0131n\u0131 ve kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fini do\u011frudan etkileyebilir.<\/p>\n<p>Modern C# uygulamalar\u0131 geli\u015ftirirken, veri modellerinizi nas\u0131l tan\u0131mlayaca\u011f\u0131n\u0131z konusunda kar\u015f\u0131n\u0131za \u00fc\u00e7 ana se\u00e7enek \u00e7\u0131kar: <code>class<\/code>, <code>struct<\/code> ve <code>record<\/code>. Her birinin kendine \u00f6zg\u00fc avantajlar\u0131, dezavantajlar\u0131 ve kullan\u0131m senaryolar\u0131 bulunur. Do\u011fru se\u00e7imi yapmak, projenizin \u00f6l\u00e7eklenebilirli\u011fi, performans\u0131 ve hatta hata ay\u0131klama s\u00fcre\u00e7leri i\u00e7in kritik \u00f6neme sahiptir. Peki, bu se\u00e7enekler aras\u0131nda ne gibi farkl\u0131l\u0131klar var ve en uygun karar\u0131 nas\u0131l verebiliriz? Bu makalede, bu sorular\u0131n cevaplar\u0131n\u0131 detayl\u0131 \u00f6rnekler ve ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m inceleyece\u011fiz. Gelin, C#\u2019taki veri modelleme d\u00fcnyas\u0131na birlikte dalal\u0131m!<\/p>\n<p>C# programlama dilinde, veri tiplerini tan\u0131mlarken Class, Struct ve Record gibi farkl\u0131 yap\u0131lar kullan\u0131r\u0131z. Ancak, bu yap\u0131lar\u0131n her birinin bellekteki davran\u0131\u015flar\u0131, performans karakteristikleri ve kullan\u0131m ama\u00e7lar\u0131 birbirinden olduk\u00e7a farkl\u0131d\u0131r. Bu farklar\u0131 anlamak, daha verimli, g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir C# uygulamalar\u0131 geli\u015ftirmek i\u00e7in hayati \u00f6nem ta\u015f\u0131r. Yanl\u0131\u015f bir se\u00e7im yapmak, uygulaman\u0131z\u0131n gereksiz yere yava\u015flamas\u0131na, fazla bellek t\u00fcketmesine veya beklenmedik hatalara yol a\u00e7abilir. Bu nedenle, her geli\u015ftiricinin bu \u00fc\u00e7 temel yap\u0131 hakk\u0131nda derinlemesine bilgi sahibi olmas\u0131 gerekir.<\/p>\n<p>Temelde, <code>class<\/code>&#8216;lar referans tipleridir ve nesne tabanl\u0131 programlaman\u0131n (OOP) temelini olu\u015ftururlar. Genellikle daha b\u00fcy\u00fck, karma\u015f\u0131k veri yap\u0131lar\u0131 ve davran\u0131\u015flar i\u00e7in kullan\u0131l\u0131rlar. Bellekte &#8220;heap&#8221; ad\u0131 verilen bir alanda ya\u015farlar ve bir de\u011fi\u015fkene atand\u0131klar\u0131nda, asl\u0131nda o nesnenin bellekteki adresini (referans\u0131n\u0131) tutarlar. Bu davran\u0131\u015f, esneklik ve kal\u0131t\u0131m gibi g\u00fc\u00e7l\u00fc \u00f6zellikler sa\u011flarken, bellek y\u00f6netimi (garbage collection) a\u00e7\u0131s\u0131ndan da baz\u0131 maliyetleri beraberinde getirebilir.<\/p>\n<p>Di\u011fer yandan, <code>struct<\/code>&#8216;lar de\u011fer tipleridir. Genellikle daha k\u00fc\u00e7\u00fck, basit veri yap\u0131lar\u0131 i\u00e7in tasarlanm\u0131\u015flard\u0131r ve \u00e7o\u011funlukla &#8220;stack&#8221; bellekte tutulurlar. Bir <code>struct<\/code> bir de\u011fi\u015fkene atand\u0131\u011f\u0131nda veya bir fonksiyona parametre olarak ge\u00e7ti\u011finde, verinin kendisi kopyalan\u0131r. Bu de\u011fer semanti\u011fi, k\u00fc\u00e7\u00fck veri yap\u0131lar\u0131 i\u00e7in daha h\u0131zl\u0131 eri\u015fim ve daha az \u00e7\u00f6p toplama y\u00fck\u00fc anlam\u0131na gelebilir. Ancak, b\u00fcy\u00fck <code>struct<\/code>&#8216;lar kullanmak, kopyalama maliyetleri nedeniyle performans d\u00fc\u015f\u00fc\u015flerine neden olabilir.<\/p>\n<p>Son olarak, .NET 5 ile hayat\u0131m\u0131za giren <code>record<\/code>&#8216;lar, de\u011fi\u015fmez (immutable) veri tipleri olu\u015fturman\u0131n modern ve daha kolay bir yolunu sunar. Hem <code>class<\/code> hem de <code>struct<\/code> olarak tan\u0131mlanabilirler (<code>record class<\/code> veya <code>record struct<\/code>). As\u0131l g\u00fcc\u00fc, de\u011fer tabanl\u0131 e\u015fitlik kar\u015f\u0131la\u015ft\u0131rmas\u0131 ve &#8220;non-destructive mutation&#8221; (<code>with<\/code> ifadesi ile yeni bir nesne olu\u015fturma) gibi \u00f6zellikleridir. <code>record<\/code>&#8216;lar \u00f6zellikle veri ta\u015f\u0131ma nesneleri (DTO&#8217;lar), yap\u0131land\u0131rma ayarlar\u0131 veya herhangi bir de\u011fi\u015fmez veri modellemesi i\u00e7in idealdir. Bu sayede, daha g\u00fcvenli ve \u00f6ng\u00f6r\u00fclebilir kod yazmak m\u00fcmk\u00fcn hale gelir. Bu yap\u0131lar\u0131n her birini ne zaman ve nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 bilmek, C# projelerimizde ak\u0131ll\u0131ca kararlar vermemize olanak tan\u0131r.<\/p>\n<h2>C# Class Nedir ve Ne Zaman Kullan\u0131lmal\u0131d\u0131r?<\/h2>\n<p>C# dilindeki <code>class<\/code>, nesne tabanl\u0131 programlaman\u0131n (OOP) temel yap\u0131 ta\u015f\u0131d\u0131r. Bir <code>class<\/code>, genellikle karma\u015f\u0131k varl\u0131klar\u0131, onlar\u0131n \u00f6zelliklerini (<code>properties<\/code>) ve davran\u0131\u015flar\u0131n\u0131 (<code>methods<\/code>) modellemek i\u00e7in kullan\u0131l\u0131r. En \u00f6nemli \u00f6zelli\u011fi, bir referans tipi olmas\u0131d\u0131r. Bu, <code>class<\/code>&#8216;lar\u0131n bellekte heap b\u00f6lgesinde ayr\u0131lan alanlarda sakland\u0131\u011f\u0131 ve bir <code>class<\/code> t\u00fcr\u00fcndeki de\u011fi\u015fkenin asl\u0131nda bu bellek alan\u0131n\u0131n adresini (referans\u0131n\u0131) tuttu\u011fu anlam\u0131na gelir.<\/p>\n<p>Referans tipi olmalar\u0131 sayesinde, <code>class<\/code>&#8216;lar kal\u0131t\u0131m (inheritance) ve polimorfizm gibi OOP prensiplerini destekler. Yani, bir <code>class<\/code> ba\u015fka bir <code>class<\/code>&#8216;tan t\u00fcreyebilir, onun \u00f6zelliklerini ve metotlar\u0131n\u0131 miras alabilir, hatta onlar\u0131 ge\u00e7ersiz k\u0131labilir (override). Bu esneklik, geni\u015f ve mod\u00fcler uygulamalar geli\u015ftirmek i\u00e7in vazge\u00e7ilmezdir. Ayr\u0131ca, <code>class<\/code> \u00f6rnekleri (nesneleri) varsay\u0131lan olarak null de\u011ferini alabilir, bu da bir nesnenin varl\u0131\u011f\u0131n\u0131 veya yoklu\u011funu kontrol etme esnekli\u011fi sunar.<\/p>\n<h3>Class Kullan\u0131m Senaryolar\u0131 ve Bir Vaka Analizi<\/h3>\n<p><code>class<\/code>&#8216;lar genellikle a\u015fa\u011f\u0131daki durumlarda tercih edilir:<\/p>\n<ul>\n<li><strong>B\u00fcy\u00fck ve Karma\u015f\u0131k Nesneler:<\/strong> \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131ndaki <code>Product<\/code>, <code>Customer<\/code>, <code>Order<\/code> gibi varl\u0131klar. Bu nesneler genellikle birden fazla \u00f6zellik, karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 ve di\u011fer nesnelerle ili\u015fkiler i\u00e7erir.<\/li>\n<li><strong>Kal\u0131t\u0131m\u0131n Gerekti\u011fi Durumlar:<\/strong> Ortak \u00f6zelliklere sahip nesneler aras\u0131nda bir hiyerar\u015fi olu\u015fturmak istedi\u011finizde, \u00f6rne\u011fin <code>Shape<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreyen <code>Circle<\/code> ve <code>Rectangle<\/code> s\u0131n\u0131flar\u0131.<\/li>\n<li><strong>Polimorfizm \u0130htiyac\u0131:<\/strong> Farkl\u0131 t\u00fcrdeki nesneleri tek bir aray\u00fcz \u00fczerinden i\u015flemek istedi\u011finizde.<\/li>\n<li><strong>Nesnelerin Referans ile Payla\u015f\u0131lmas\u0131:<\/strong> Birden fazla kod par\u00e7as\u0131n\u0131n ayn\u0131 nesne \u00fczerinde \u00e7al\u0131\u015fmas\u0131n\u0131 ve de\u011fi\u015fiklikleri yans\u0131tmas\u0131n\u0131 istedi\u011finizde.<\/li>\n<\/ul>\n<p><strong>Vaka Analizi: E-ticaret Uygulamas\u0131nda \u00dcr\u00fcn Y\u00f6netimi<\/strong><\/p>\n<p>B\u00fcy\u00fck bir e-ticaret uygulamas\u0131nda, bir <code>Product<\/code> (\u00dcr\u00fcn) nesnesini modelleyelim. Bir \u00fcr\u00fcn\u00fcn ad\u0131, a\u00e7\u0131klamas\u0131, fiyat\u0131, stok adedi gibi temel \u00f6zelliklerinin yan\u0131 s\u0131ra, farkl\u0131 varyantlar\u0131 (beden, renk), kategorileri, yorumlar\u0131 ve hatta tedarik\u00e7i bilgileri gibi karma\u015f\u0131k ili\u015fkileri olabilir. Bu durumda, <code>class<\/code> kullanmak en mant\u0131kl\u0131 yakla\u015f\u0131md\u0131r:<\/p>\n<pre><code>\n    public class Product\n    {\n        public int Id { get; set; }\n        public string Name { get; set; }\n        public string Description { get; set; }\n        public decimal Price { get; set; }\n        public int StockQuantity { get; set; }\n        public Category ProductCategory { get; set; } \/\/ Ba\u015fka bir Class\n        public List<Review> Reviews { get; set; }    \/\/ Ba\u015fka bir Class listesi\n\n        public Product(int id, string name, decimal price)\n        {\n            Id = id;\n            Name = name;\n            Price = price;\n            Reviews = new List<Review>();\n        }\n\n        public void ApplyDiscount(decimal percentage)\n        {\n            Price -= Price * (percentage \/ 100);\n            Console.WriteLine($\"{Name} i\u00e7in {percentage}% indirim uyguland\u0131. Yeni fiyat: {Price}\");\n        }\n    }\n\n    public class Category\n    {\n        public int Id { get; set; }\n        public string Name { get; set; }\n    }\n\n    \/\/ Kullan\u0131m \u00f6rne\u011fi\n    var elektronikCategory = new Category { Id = 1, Name = \"Elektronik\" };\n    var laptop = new Product(101, \"Oyun Laptopu\", 25000M)\n    {\n        Description = \"Y\u00fcksek performansl\u0131 oyun bilgisayar\u0131.\",\n        StockQuantity = 5,\n        ProductCategory = elektronikCategory\n    };\n    laptop.ApplyDiscount(10);\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Product<\/code> s\u0131n\u0131f\u0131 hem kendi \u00f6zelliklerini hem de <code>Category<\/code> ve <code>Review<\/code> gibi di\u011fer s\u0131n\u0131flarla olan ili\u015fkilerini y\u00f6netir. <code>ApplyDiscount<\/code> metodu ile \u00fcr\u00fcne \u00f6zel bir davran\u0131\u015f tan\u0131mlayabiliriz. <code>Product<\/code> nesnesi, bellekte bir referans olarak ya\u015far ve farkl\u0131 fonksiyonlar veya bile\u015fenler taraf\u0131ndan payla\u015f\u0131labilir, bu da merkezi bir \u00fcr\u00fcn bilgisi y\u00f6netimi sa\u011flar.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: B\u00fcy\u00fck ve karma\u015f\u0131k nesneler i\u00e7in her zaman <code>class<\/code> kullan\u0131n. \u00d6zellikle nesnenin ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca de\u011fi\u015fmesi beklenen veya di\u011fer nesnelerle referans yoluyla etkile\u015fime girmesi gereken durumlarda <code>class<\/code>'lar en do\u011fru se\u00e7imdir. Referans t\u00fcrleri, null atanabilir olmalar\u0131 sayesinde varl\u0131klar\u0131n iste\u011fe ba\u011fl\u0131l\u0131\u011f\u0131n\u0131 daha kolay ifade etmenizi sa\u011flar.\n    <\/div>\n<h2>C# Struct Nedir ve Hangi Durumlarda Tercih Edilmelidir?<\/h2>\n<p>C# dilindeki <code>struct<\/code>, <code>class<\/code>'lar\u0131n aksine bir de\u011fer tipidir. Bu, <code>struct<\/code> \u00f6rneklerinin do\u011frudan bellekteki veri de\u011ferini tuttu\u011fu ve bir de\u011fi\u015fkene atand\u0131\u011f\u0131nda veya bir metoda parametre olarak ge\u00e7ti\u011finde t\u00fcm verinin kopyaland\u0131\u011f\u0131 anlam\u0131na gelir. Genellikle, <code>struct<\/code>'lar stack bellekte (k\u00fc\u00e7\u00fck ve ge\u00e7ici veriler i\u00e7in kullan\u0131lan h\u0131zl\u0131 bellek b\u00f6lgesi) veya bir nesnenin par\u00e7as\u0131 olarak inline olarak tutulur. Bu de\u011fer semanti\u011fi, belirli senaryolarda <code>class<\/code>'lara g\u00f6re \u00f6nemli performans avantajlar\u0131 sa\u011flayabilir.<\/p>\n<p><code>struct<\/code>'lar, basit ve k\u00fc\u00e7\u00fck veri yap\u0131lar\u0131n\u0131 temsil etmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. \u00d6rne\u011fin, bir noktay\u0131 (x, y koordinatlar\u0131), bir rengi (RGB de\u011ferleri) veya k\u00fc\u00e7\u00fck bir zaman aral\u0131\u011f\u0131n\u0131 (saat, dakika, saniye) modellemek i\u00e7in idealdirler. <code>struct<\/code>'lar kal\u0131t\u0131m\u0131 desteklemezler; yani ba\u015fka bir <code>struct<\/code>'tan t\u00fcreyemezler veya ba\u015fka bir <code>struct<\/code>'\u0131n temel tipi olamazlar (ancak aray\u00fczleri uygulayabilirler). Ayr\u0131ca, <code>struct<\/code>'lar\u0131n varsay\u0131lan constructor'\u0131 parametresiz olamaz ve alanlar\u0131 do\u011frudan ba\u015flat\u0131lamaz; bu genellikle constructor arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r veya otomatik \u00f6zellikler kullan\u0131l\u0131r.<\/p>\n<h3>Struct Kullan\u0131m Senaryolar\u0131 ve Bir Vaka Analizi<\/h3>\n<p><code>struct<\/code>'lar genellikle a\u015fa\u011f\u0131daki durumlarda tercih edilir:<\/p>\n<ul>\n<li><strong>K\u00fc\u00e7\u00fck Veri Yap\u0131lar\u0131:<\/strong> Bellekte \u00e7ok az yer kaplayan ve s\u0131k s\u0131k kopyalanabilecek basit veri gruplar\u0131 i\u00e7in, \u00f6rne\u011fin <code>Point<\/code>, <code>Color<\/code>, <code>DateTime<\/code>.<\/li>\n<li><strong>Performans Kritik Alanlar:<\/strong> \u00d6zellikle d\u00f6ng\u00fclerde veya \u00e7ok say\u0131da k\u00fc\u00e7\u00fck nesnenin olu\u015fturuldu\u011fu durumlarda, <code>struct<\/code>'lar\u0131n kopyalama ve \u00e7\u00f6p toplama maliyeti <code>class<\/code>'lara g\u00f6re daha d\u00fc\u015f\u00fck olabilir.<\/li>\n<li><strong>De\u011fer Semanti\u011fi \u0130stenildi\u011finde:<\/strong> Verinin kopyalanmas\u0131n\u0131 ve ba\u011f\u0131ms\u0131z olarak i\u015flenmesini istedi\u011finizde, yani bir nesnenin \"referans\u0131n\u0131\" de\u011fil, \"de\u011ferini\" \u00f6nemsedi\u011finizde.<\/li>\n<li><strong>De\u011fi\u015fmezlik:<\/strong> <code>struct<\/code>'lar do\u011fal olarak de\u011fi\u015fmez (immutable) olmaya yatk\u0131nd\u0131r. E\u011fer t\u00fcm \u00f6zellikleri <code>readonly<\/code> olarak tan\u0131mlan\u0131rsa, tamamen de\u011fi\u015fmez bir yap\u0131 elde edilebilir.<\/li>\n<\/ul>\n<p><strong>Vaka Analizi: Oyun Geli\u015ftirmede 2D Vekt\u00f6r Kullan\u0131m\u0131<\/strong><\/p>\n<p>Bir oyun motorunda 2D koordinatlar\u0131 veya vekt\u00f6rleri temsil etmek i\u00e7in s\u0131k\u00e7a <code>Vector2D<\/code> gibi bir yap\u0131ya ihtiya\u00e7 duyulur. Bu t\u00fcr yap\u0131lar oyun d\u00f6ng\u00fcs\u00fc boyunca binlerce kez olu\u015fturulur, kopyalan\u0131r ve \u00fczerinde i\u015flem yap\u0131l\u0131r. Bu senaryoda <code>struct<\/code> kullanmak, performans a\u00e7\u0131s\u0131ndan \u00f6nemli avantajlar sa\u011flar:<\/p>\n<pre><code>\n    public struct Vector2D\n    {\n        public float X { get; }\n        public float Y { get; }\n\n        public Vector2D(float x, float y)\n        {\n            X = x;\n            Y = y;\n        }\n\n        public Vector2D Add(Vector2D other)\n        {\n            return new Vector2D(X + other.X, Y + other.Y);\n        }\n\n        public float Length()\n        {\n            return (float)Math.Sqrt(X * X + Y * Y);\n        }\n\n        public override string ToString()\n        {\n            return $\"({X}, {Y})\";\n        }\n    }\n\n    \/\/ Kullan\u0131m \u00f6rne\u011fi\n    var pos1 = new Vector2D(10f, 20f);\n    var pos2 = new Vector2D(5f, 7f);\n    var newPos = pos1.Add(pos2); \/\/ pos1 ve pos2 kopyalan\u0131r, yeni bir Vector2D d\u00f6ner\n    Console.WriteLine($\"\u0130lk pozisyon: {pos1}\");\n    Console.WriteLine($\"Yeni pozisyon: {newPos}\");\n    Console.WriteLine($\"Yeni pozisyon uzunlu\u011fu: {newPos.Length()}\");\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Vector2D<\/code> bir <code>struct<\/code> olarak tan\u0131mlanm\u0131\u015ft\u0131r. <code>X<\/code> ve <code>Y<\/code> \u00f6zellikleri <code>get;<\/code> ile yaln\u0131zca okunabilir yap\u0131lm\u0131\u015f, bu da <code>Vector2D<\/code>'yi de\u011fi\u015fmez k\u0131lar. <code>Add<\/code> metodu, yeni bir <code>Vector2D<\/code> d\u00f6nd\u00fcr\u00fcr, mevcut nesneyi de\u011fi\u015ftirmez. Bu davran\u0131\u015f, \u00f6zellikle \u00e7ok i\u015f par\u00e7ac\u0131kl\u0131 ortamlarda veya s\u0131k s\u0131k ge\u00e7ici nesnelerle \u00e7al\u0131\u015f\u0131lan durumlarda hatalar\u0131 azaltabilir. Kopyalama maliyeti, iki float de\u011feri kopyalamak kadar d\u00fc\u015f\u00fck oldu\u011fu i\u00e7in performans\u0131 olumsuz etkilemez, aksine referans tabanl\u0131 bir s\u0131n\u0131f kullanmaktan daha iyi olabilir.<\/p>\n<h3>Class ve Struct Aras\u0131ndaki Temel Farklar Nelerdir?<\/h3>\n<p>Bu iki yap\u0131n\u0131n farkl\u0131 kullan\u0131m alanlar\u0131na sahip olmas\u0131n\u0131n temel nedeni, bellekteki davran\u0131\u015flar\u0131d\u0131r. \u0130\u015fte kritik farklar:<\/p>\n<ul>\n<li><strong>Tip Kategorisi:<\/strong> <code>Class<\/code> referans tipidir, <code>struct<\/code> de\u011fer tipidir.<\/li>\n<li><strong>Bellek Yeri:<\/strong> <code>Class<\/code> nesneleri heap'te, <code>struct<\/code>'lar genellikle stack'te veya i\u00e7eren nesnenin i\u00e7inde tutulur.<\/li>\n<li><strong>Kopyalama Davran\u0131\u015f\u0131:<\/strong> <code>Class<\/code> atand\u0131\u011f\u0131nda veya metotlara ge\u00e7ti\u011finde referans kopyalan\u0131r. <code>Struct<\/code> atand\u0131\u011f\u0131nda veya metotlara ge\u00e7ti\u011finde verinin kendisi kopyalan\u0131r.<\/li>\n<li><strong>Kal\u0131t\u0131m:<\/strong> <code>Class<\/code> kal\u0131t\u0131m\u0131 destekler, <code>struct<\/code> desteklemez (aray\u00fczler hari\u00e7).<\/li>\n<li><strong>Null De\u011fer:<\/strong> <code>Class<\/code> null olabilir, <code>struct<\/code> varsay\u0131lan olarak null olamaz (<code>Nullable<T><\/code> ile m\u00fcmk\u00fcn).<\/li>\n<li><strong>\u00c7\u00f6p Toplama:<\/strong> <code>Class<\/code> nesneleri \u00e7\u00f6p toplay\u0131c\u0131 taraf\u0131ndan y\u00f6netilir, <code>struct<\/code>'lar genellikle kapsam d\u0131\u015f\u0131na \u00e7\u0131kt\u0131klar\u0131nda otomatik olarak temizlenir.<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: <code>Struct<\/code> kullan\u0131rken dikkatli olun! E\u011fer <code>struct<\/code>'\u0131n\u0131z 16 byte'tan (\u00f6rne\u011fin 4 <code>int<\/code> veya 2 <code>long<\/code>) b\u00fcy\u00fckse veya s\u0131k s\u0131k \"boxing\" (<code>struct<\/code>'\u0131n <code>object<\/code>'e d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi) yap\u0131l\u0131yorsa, performans avantajlar\u0131 kaybolabilir ve <code>class<\/code> kullanmak daha iyi olabilir. De\u011fi\u015fmez (immutable) <code>struct<\/code>'lar genellikle daha g\u00fcvenlidir.\n    <\/div>\n<h2>C# Record Nedir ve Modern Uygulamalarda Nas\u0131l Bir Yer Edinmi\u015ftir?<\/h2>\n<p>.NET 5 ile birlikte C# d\u00fcnyas\u0131na kat\u0131lan <code>record<\/code> anahtar kelimesi, \u00f6zellikle de\u011fi\u015fmez (immutable) veri modelleri olu\u015fturmay\u0131 kolayla\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>record<\/code>'lar, hem <code>record class<\/code> (varsay\u0131lan) hem de <code>record struct<\/code> \u015feklinde tan\u0131mlanabilir, ancak yayg\u0131n olarak <code>record class<\/code> kullan\u0131m\u0131 ama\u00e7lanm\u0131\u015ft\u0131r. <code>record<\/code>'lar\u0131n temel amac\u0131, veri odakl\u0131 tipler i\u00e7in daha k\u0131sa ve okunabilir bir s\u00f6zdizimi sa\u011flamak, de\u011fer tabanl\u0131 e\u015fitlik kar\u015f\u0131la\u015ft\u0131rmas\u0131 sunmak ve \"non-destructive mutation\" (var olan bir nesnenin kopyas\u0131 \u00fczerinde de\u011fi\u015fiklik yapma) yetene\u011fi ile gelmektir.<\/p>\n<p>Bir <code>record<\/code>'\u0131n en belirgin \u00f6zelli\u011fi, varsay\u0131lan olarak de\u011fer tabanl\u0131 e\u015fitlik sa\u011flamas\u0131d\u0131r. Yani, iki <code>record<\/code> nesnesinin t\u00fcm \u00f6zellikleri ayn\u0131 de\u011fere sahipse, bunlar e\u015fit kabul edilirler. Geleneksel <code>class<\/code>'larda ise referans tabanl\u0131 e\u015fitlik kullan\u0131l\u0131r; iki nesnenin e\u015fit olmas\u0131 i\u00e7in ayn\u0131 bellek adresini i\u015faret etmeleri gerekir. Bu fark, veri ta\u015f\u0131ma nesneleri (DTO'lar) veya yap\u0131land\u0131rma nesneleri gibi de\u011fi\u015fmez veri modelleri i\u00e7in <code>record<\/code>'lar\u0131 son derece kullan\u0131\u015fl\u0131 k\u0131lar.<\/p>\n<p>Ayr\u0131ca, <code>record<\/code>'lar, \"with\" ifadesi ile birlikte gelir. Bu ifade, mevcut bir <code>record<\/code> \u00f6rne\u011finden yola \u00e7\u0131karak, baz\u0131 \u00f6zelliklerini de\u011fi\u015ftirerek yeni bir <code>record<\/code> \u00f6rne\u011fi olu\u015fturman\u0131z\u0131 sa\u011flar. Bu, orijinal nesnenin de\u011fi\u015fmeden kalmas\u0131n\u0131 garantilerken, kolayca varyasyonlar olu\u015fturabilmenizi sa\u011flar. Bu davran\u0131\u015f, fonksiyonel programlama yakla\u015f\u0131mlar\u0131na da uyum sa\u011flar.<\/p>\n<h3>Record Kullan\u0131m Senaryolar\u0131 ve Bir Vaka Analizi<\/h3>\n<p><code>record<\/code>'lar genellikle a\u015fa\u011f\u0131daki durumlarda tercih edilir:<\/p>\n<ul>\n<li><strong>Veri Ta\u015f\u0131ma Nesneleri (DTO'lar):<\/strong> API'lar aras\u0131nda veri al\u0131\u015fveri\u015fi yaparken, <code>record<\/code>'lar de\u011fi\u015fmez ve de\u011fer tabanl\u0131 e\u015fitlik sayesinde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<li><strong>Yap\u0131land\u0131rma Nesneleri:<\/strong> Uygulama ayarlar\u0131 gibi, bir kez y\u00fcklendikten sonra de\u011fi\u015fmesi beklenmeyen veriler i\u00e7in idealdir.<\/li>\n<li><strong>De\u011fi\u015fmez Veri Modelleri:<\/strong> \u00d6zellikle multi-threading ortamlar\u0131nda veya bir nesnenin durumunun g\u00fcvenli bir \u015fekilde korunmas\u0131 gereken durumlarda.<\/li>\n<li><strong>Basit De\u011fer Objeleri:<\/strong> Sadece bir grup de\u011feri kapsayan ve davran\u0131\u015ftan ziyade veriye odaklanan tipler i\u00e7in.<\/li>\n<\/ul>\n<p><strong>Vaka Analizi: API Yan\u0131tlar\u0131n\u0131 Modelleme<\/strong><\/p>\n<p>Bir web API'sinden gelen kullan\u0131c\u0131 bilgilerini temsil eden bir veri modelimiz oldu\u011funu d\u00fc\u015f\u00fcnelim. Bu verilerin al\u0131nd\u0131ktan sonra genellikle de\u011fi\u015fmez olmas\u0131 ve basit bir \u015fekilde kar\u015f\u0131la\u015ft\u0131r\u0131labilmesi istenir. <code>record<\/code>, bu senaryo i\u00e7in m\u00fckemmel bir \u00e7\u00f6z\u00fcmd\u00fcr:<\/p>\n<pre><code>\n    public record UserProfile(int Id, string Username, string Email);\n\n    \/\/ Kullan\u0131m \u00f6rne\u011fi\n    var user1 = new UserProfile(1, \"ali.veli\", \"ali.veli@example.com\");\n    var user2 = new UserProfile(1, \"ali.veli\", \"ali.veli@example.com\");\n    var user3 = new UserProfile(2, \"ayse.fatma\", \"ayse.fatma@example.com\");\n\n    Console.WriteLine($\"User1 ve User2 e\u015fit mi? {user1 == user2}\"); \/\/ True (De\u011fer tabanl\u0131 e\u015fitlik)\n    Console.WriteLine($\"User1 ve User3 e\u015fit mi? {user1 == user3}\"); \/\/ False\n\n    \/\/ 'with' ifadesi ile yeni bir kopya olu\u015fturma\n    var updatedUser1 = user1 with { Email = \"yeni.email@example.com\" };\n    Console.WriteLine($\"G\u00fcncellenmi\u015f Kullan\u0131c\u0131: {updatedUser1}\");\n    Console.WriteLine($\"Orijinal Kullan\u0131c\u0131 (de\u011fi\u015fmedi): {user1}\");\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>UserProfile<\/code> bir <code>record<\/code> olarak tan\u0131mlanm\u0131\u015ft\u0131r. <code>Id<\/code>, <code>Username<\/code> ve <code>Email<\/code> \u00f6zellikleri, constructor ile otomatik olarak atan\u0131r. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>user1<\/code> ve <code>user2<\/code> ayn\u0131 \u00f6zellik de\u011ferlerine sahip olduklar\u0131 i\u00e7in <code>==<\/code> operat\u00f6r\u00fc <code>true<\/code> d\u00f6ner. Ayr\u0131ca, <code>with<\/code> ifadesi ile <code>user1<\/code>'in e-posta adresini de\u011fi\u015ftirerek <code>updatedUser1<\/code> ad\u0131nda yepyeni bir <code>record<\/code> nesnesi olu\u015fturulmu\u015ftur; orijinal <code>user1<\/code> nesnesi ise de\u011fi\u015fmeden kal\u0131r. Bu sayede, de\u011fi\u015fmezlik prensibi korunur ve kodunuz daha g\u00fcvenilir hale gelir.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: <code>record<\/code>'lar, genellikle de\u011fi\u015fmez veri modelleri i\u00e7in idealdir. E\u011fer bir nesnenin \u00f6mr\u00fc boyunca durumunun de\u011fi\u015fmesini beklemiyorsan\u0131z ve de\u011fer tabanl\u0131 e\u015fitlik sizin i\u00e7in \u00f6nemliyse, <code>record<\/code> kullanmak kodunuzu daha temiz ve g\u00fcvenli hale getirecektir. .NET 6 ile gelen <code>record struct<\/code>, performans kritik de\u011fi\u015fmez de\u011fer tipleri i\u00e7in de bir se\u00e7enektir.\n    <\/div>\n<h2>Record, Class ve Struct Aras\u0131ndaki Kar\u015f\u0131la\u015ft\u0131rmal\u0131 Bir Analiz<\/h2>\n<p>\u00dc\u00e7 yap\u0131y\u0131 da ayr\u0131 ayr\u0131 inceledikten sonra, temel farkl\u0131l\u0131klar\u0131n\u0131 bir arada g\u00f6rmek, do\u011fru se\u00e7imi yapmam\u0131za yard\u0131mc\u0131 olacakt\u0131r. Bu kar\u015f\u0131la\u015ft\u0131rma, performans, bellek y\u00f6netimi, kal\u0131t\u0131m ve e\u015fitlik gibi kritik fakt\u00f6rler \u00fczerinden yap\u0131lacakt\u0131r.<\/p>\n<table class=\"comparison-table\">\n<thead>\n<tr>\n<th>\u00d6zellik<\/th>\n<th>Class<\/th>\n<th>Struct<\/th>\n<th>Record<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Tip Kategorisi<\/strong><\/td>\n<td>Referans Tipi<\/td>\n<td>De\u011fer Tipi<\/td>\n<td>Referans Tipi (varsay\u0131lan, <code>record class<\/code>) veya De\u011fer Tipi (<code>record struct<\/code>)<\/td>\n<\/tr>\n<tr>\n<td><strong>Bellek Yeri<\/strong><\/td>\n<td>Heap<\/td>\n<td>Stack (genellikle) veya i\u00e7eren nesnenin i\u00e7inde<\/td>\n<td>Heap (<code>record class<\/code>) veya Stack (<code>record struct<\/code>)<\/td>\n<\/tr>\n<tr>\n<td><strong>Kopyalama Davran\u0131\u015f\u0131<\/strong><\/td>\n<td>Referans kopyalan\u0131r<\/td>\n<td>T\u00fcm de\u011fer kopyalan\u0131r<\/td>\n<td>Referans kopyalan\u0131r (<code>record class<\/code>), t\u00fcm de\u011fer kopyalan\u0131r (<code>record struct<\/code>)<\/td>\n<\/tr>\n<tr>\n<td><strong>Kal\u0131t\u0131m<\/strong><\/td>\n<td>Destekler<\/td>\n<td>Desteklemez (aray\u00fczler hari\u00e7)<\/td>\n<td>Destekler (<code>record class<\/code> i\u00e7in)<\/td>\n<\/tr>\n<tr>\n<td><strong>E\u015fitlik Kar\u015f\u0131la\u015ft\u0131rmas\u0131 (<code>==<\/code>)<\/strong><\/td>\n<td>Referans tabanl\u0131<\/td>\n<td>De\u011fer tabanl\u0131 (varsay\u0131lan olarak de\u011fer alanlar\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131r)<\/td>\n<td>De\u011fer tabanl\u0131 (otomatik olarak t\u00fcm \u00f6zelliklerini kar\u015f\u0131la\u015ft\u0131r\u0131r)<\/td>\n<\/tr>\n<tr>\n<td><strong>De\u011fi\u015fmezlik (Immutability)<\/strong><\/td>\n<td>Varsay\u0131lan olarak de\u011fi\u015febilir, de\u011fi\u015fmez yapmak ekstra \u00e7aba gerektirir<\/td>\n<td>K\u00fc\u00e7\u00fck ve t\u00fcm \u00f6zellikleri <code>readonly<\/code> ise do\u011fal olarak de\u011fi\u015fmez olabilir<\/td>\n<td>Varsay\u0131lan olarak de\u011fi\u015fmezlik odakl\u0131d\u0131r, <code>with<\/code> ifadesi ile kolayca yeni varyantlar olu\u015fturulur<\/td>\n<\/tr>\n<tr>\n<td><strong>Null Atanabilirlik<\/strong><\/td>\n<td>Null olabilir<\/td>\n<td>Null olamaz (<code>Nullable<T><\/code> ile m\u00fcmk\u00fcn)<\/td>\n<td>Null olabilir (<code>record class<\/code>), Null olamaz (<code>record struct<\/code>)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Performans ve Bellek Y\u00f6netimi A\u00e7\u0131s\u0131ndan Hangisi Daha \u0130yidir?<\/h3>\n<p>Performans ve bellek y\u00f6netimi a\u00e7\u0131s\u0131ndan \"en iyi\" se\u00e7enek, kullan\u0131m senaryosuna g\u00f6re de\u011fi\u015fir. Genel olarak:<\/p>\n<ul>\n<li><strong>Struct:<\/strong> K\u00fc\u00e7\u00fck boyutlu ve s\u0131k\u00e7a olu\u015fturulan nesneler i\u00e7in <code>struct<\/code>'lar, heap tahsisi ve \u00e7\u00f6p toplama maliyetinden ka\u00e7\u0131nd\u0131klar\u0131 i\u00e7in daha iyi performans sunabilir. Ancak b\u00fcy\u00fck <code>struct<\/code>'lar, kopyalama maliyeti nedeniyle performans d\u00fc\u015f\u00fc\u015flerine yol a\u00e7abilir.<\/li>\n<li><strong>Class:<\/strong> B\u00fcy\u00fck ve karma\u015f\u0131k nesneler i\u00e7in <code>class<\/code>'lar daha uygundur. Referanslar\u0131n kopyalanmas\u0131, b\u00fcy\u00fck verinin kendisinin kopyalanmas\u0131ndan daha ucuzdur. Ancak, \u00e7ok say\u0131da k\u0131sa \u00f6m\u00fcrl\u00fc <code>class<\/code> nesnesi olu\u015fturmak, \u00e7\u00f6p toplay\u0131c\u0131 \u00fczerinde y\u00fck olu\u015fturabilir.<\/li>\n<li><strong>Record:<\/strong> Performans a\u00e7\u0131s\u0131ndan <code>record class<\/code>'lar, standart <code>class<\/code>'larla benzer \u00f6zelliklere sahiptir. <code>record struct<\/code> ise <code>struct<\/code>'larla benzer performans \u00f6zellikleri g\u00f6sterir ancak de\u011fi\u015fmezlik ve de\u011fer tabanl\u0131 e\u015fitlik ekstralar\u0131 sunar. <code>with<\/code> ifadesinin kullan\u0131lmas\u0131, yeni nesne tahsisi anlam\u0131na gelir ve bu da dikkatli kullan\u0131lmal\u0131d\u0131r.<\/li>\n<\/ul>\n<h3>E\u015fitlik Kar\u015f\u0131la\u015ft\u0131rmalar\u0131nda Nas\u0131l Davran\u0131rlar?<\/h3>\n<ul>\n<li><strong>Class:<\/strong> Varsay\u0131lan olarak referans e\u015fitli\u011fi sa\u011flar. \u0130ki <code>class<\/code> nesnesi, ayn\u0131 bellek adresini i\u015faret ediyorlarsa e\u015fittirler. \u0130\u00e7erik e\u015fitli\u011fini sa\u011flamak i\u00e7in <code>Equals()<\/code> metodunu veya <code>==<\/code> operat\u00f6r\u00fcn\u00fc override etmeniz gerekir.<\/li>\n<li><strong>Struct:<\/strong> Varsay\u0131lan olarak de\u011fer e\u015fitli\u011fi sa\u011flar. \u0130ki <code>struct<\/code> nesnesinin t\u00fcm alanlar\u0131 ayn\u0131 de\u011fere sahipse e\u015fittirler. Bu, otomatik olarak <code>Equals()<\/code> metodunda ve <code>==<\/code> operat\u00f6r\u00fcnde uygulan\u0131r.<\/li>\n<li><strong>Record:<\/strong> Otomatik olarak de\u011fer e\u015fitli\u011fi sa\u011flar. T\u00fcm public \u00f6zelliklerinin de\u011ferleri ayn\u0131ysa, iki <code>record<\/code> nesnesi e\u015fittir. Bu, <code>Equals()<\/code> metodu, <code>GetHashCode()<\/code> metodu ve <code>==<\/code> operat\u00f6r\u00fc i\u00e7in otomatik olarak uygulan\u0131r. Bu, <code>record<\/code>'lar\u0131 DTO'lar i\u00e7in m\u00fckemmel bir se\u00e7im yapar.<\/li>\n<\/ul>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda Do\u011fru Se\u00e7imi Nas\u0131l Yapmal\u0131y\u0131z?<\/h2>\n<p>Do\u011fru veri modelini se\u00e7mek, uygulaman\u0131z\u0131n kalitesi \u00fczerinde b\u00fcy\u00fck bir etkiye sahiptir. \u0130\u015fte baz\u0131 rehber ilkeler ve d\u00fc\u015f\u00fcn\u00fclmesi gereken senaryolar:<\/p>\n<h3>Ne Zaman Class Kullanmal\u0131y\u0131z?<\/h3>\n<p><code>class<\/code>, C#\u2019taki varsay\u0131lan ve en esnek veri modelleme se\u00e7ene\u011fidir. Genellikle a\u015fa\u011f\u0131daki durumlarda tercih edilir:<\/p>\n<ul>\n<li><strong>Karma\u015f\u0131k \u0130\u015f Mant\u0131\u011f\u0131 ve Davran\u0131\u015flar:<\/strong> Bir nesnenin sadece veri depolamakla kalmay\u0131p, ayn\u0131 zamanda \u00f6nemli i\u015f mant\u0131\u011f\u0131n\u0131 veya eylemleri de i\u00e7ermesi gerekiyorsa. \u00d6rne\u011fin, bir <code>OrderProcessor<\/code> veya <code>InventoryManager<\/code> s\u0131n\u0131f\u0131.<\/li>\n<li><strong>Kal\u0131t\u0131m ve Polimorfizm:<\/strong> Bir nesne hiyerar\u015fisi olu\u015fturman\u0131z veya farkl\u0131 t\u00fcrevleri ayn\u0131 temel t\u00fcr \u00fczerinden i\u015flemeniz gerekiyorsa. \u00d6rne\u011fin, farkl\u0131 \u00f6deme y\u00f6ntemlerini (<code>CreditCardPayment<\/code>, <code>PayPalPayment<\/code>) ortak bir <code>Payment<\/code> s\u0131n\u0131f\u0131 \u00fczerinden y\u00f6netmek.<\/li>\n<li><strong>B\u00fcy\u00fck Veri Yap\u0131lar\u0131:<\/strong> E\u011fer nesneniz \u00e7ok say\u0131da alan i\u00e7eriyorsa ve bellekte b\u00fcy\u00fck bir yer kapl\u0131yorsa, <code>class<\/code> kullanmak kopyalama maliyetini azalt\u0131r.<\/li>\n<li><strong>Nesnelerin Referans ile Payla\u015f\u0131lmas\u0131:<\/strong> Uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmlerinin ayn\u0131 nesne \u00f6rne\u011fi \u00fczerinde \u00e7al\u0131\u015fmas\u0131 ve birbirlerinin de\u011fi\u015fikliklerini g\u00f6rmesi gerekiyorsa. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n oturum bilgilerini tutan tek bir <code>Session<\/code> nesnesi.<\/li>\n<\/ul>\n<h3>Ne Zaman Struct Kullanmal\u0131y\u0131z?<\/h3>\n<p><code>struct<\/code>'lar performans avantajlar\u0131 sunsa da, dikkatli kullan\u0131lmal\u0131d\u0131r. Genellikle a\u015fa\u011f\u0131daki durumlarda en verimli olurlar:<\/p>\n<ul>\n<li><strong>K\u00fc\u00e7\u00fck ve Basit Veri Gruplar\u0131:<\/strong> \u0130ki veya \u00fc\u00e7 basit veri alan\u0131n\u0131 (<code>int<\/code>, <code>float<\/code>, <code>bool<\/code> gibi) bir araya getiren yap\u0131lar i\u00e7in. \u00d6rne\u011fin, <code>Point (x, y)<\/code>, <code>Color (R, G, B, A)<\/code> veya <code>DateTimeOffset<\/code> gibi.<\/li>\n<li><strong>De\u011fi\u015fmezlik:<\/strong> E\u011fer <code>struct<\/code>'\u0131n t\u00fcm \u00f6zellikleri <code>readonly<\/code> ise, de\u011fi\u015fmez bir de\u011fer tipi elde edersiniz. Bu, multi-threading ortamlar\u0131nda veya bir de\u011ferin de\u011fi\u015fmedi\u011finden emin olmak istedi\u011finizde g\u00fcvenli\u011fi art\u0131r\u0131r.<\/li>\n<li><strong>Performans Kritik Senaryolar:<\/strong> Oyun motorlar\u0131, grafik uygulamalar\u0131 gibi s\u0131k\u00e7a k\u00fc\u00e7\u00fck nesnelerin olu\u015fturuldu\u011fu ve kopyaland\u0131\u011f\u0131 yerlerde, \u00e7\u00f6p toplama y\u00fck\u00fcn\u00fc azaltmak i\u00e7in kullan\u0131labilirler. Ancak, bu durumda <code>struct<\/code>'\u0131n boyutu k\u00fc\u00e7\u00fck kalmal\u0131d\u0131r (tercihen 16 byte alt\u0131nda).<\/li>\n<li><strong>De\u011fer Semanti\u011fi:<\/strong> Bir nesnenin referans\u0131ndan ziyade, do\u011frudan kopyalanan \"de\u011ferini\" istedi\u011finizde.<\/li>\n<\/ul>\n<h3>Ne Zaman Record Kullanmal\u0131y\u0131z?<\/h3>\n<p><code>record<\/code>'lar, modern C# uygulamalar\u0131nda giderek daha fazla yer bulmaktad\u0131r. \u00d6zellikle a\u015fa\u011f\u0131daki senaryolarda parlarlar:<\/p>\n<ul>\n<li><strong>Veri Ta\u015f\u0131ma Nesneleri (DTO'lar):<\/strong> REST API'lerinden gelen veya g\u00f6nderilen verileri modellemek i\u00e7in idealdirler. De\u011fer tabanl\u0131 e\u015fitlik sayesinde, veri setlerinin kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131 ve de\u011fi\u015fmezlik sayesinde g\u00fcvenli aktar\u0131m kolayla\u015f\u0131r.<\/li>\n<li><strong>Yap\u0131land\u0131rma ve Ayar Nesneleri:<\/strong> Uygulama ayarlar\u0131, konfig\u00fcrasyon parametreleri gibi, bir kez y\u00fcklendikten sonra genellikle de\u011fi\u015fmeyen ve de\u011ferleri ile kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131 \u00f6nemli olan veriler i\u00e7in uygundur.<\/li>\n<li><strong>De\u011fi\u015fmez Veri Modelleri:<\/strong> Fonksiyonel programlama prensiplerini benimseyen veya veri tutarl\u0131l\u0131\u011f\u0131n\u0131n kritik oldu\u011fu uygulamalarda, bir nesnenin durumunun asla do\u011frudan de\u011fi\u015ftirilemeyece\u011fini garanti etmek i\u00e7in kullan\u0131l\u0131r. <code>with<\/code> ifadesi, de\u011fi\u015fmezlik prensibini korurken kolayca yeni varyantlar olu\u015fturman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>De\u011fer Objeleri:<\/strong> Bir kimli\u011fi olmayan, sadece bir de\u011fer k\u00fcmesini temsil eden nesneler i\u00e7in (\u00f6rne\u011fin, bir para birimi de\u011feri <code>CurrencyAmount(decimal amount, string code)<\/code>).<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Genellikle, varsay\u0131lan olarak <code>class<\/code> kullanmaya ba\u015flay\u0131n. E\u011fer k\u00fc\u00e7\u00fck, de\u011fi\u015fmez bir de\u011fer tipi ihtiyac\u0131n\u0131z varsa ve performans kritikse <code>struct<\/code>'\u0131 de\u011ferlendirin. E\u011fer de\u011fi\u015fmez bir veri ta\u015f\u0131ma nesnesi veya de\u011fer odakl\u0131 bir model ar\u0131yorsan\u0131z ve de\u011fer tabanl\u0131 e\u015fitlik \u00f6nemliyse <code>record<\/code>'lar harika bir se\u00e7imdir. Kod okunabilirli\u011fi ve g\u00fcvenli\u011fi genellikle performans\u0131n \u00f6n\u00fcne ge\u00e7er, bu y\u00fczden sadece ciddi performans sorunlar\u0131 oldu\u011funda <code>struct<\/code>'lara y\u00f6nelin.\n    <\/div>\n<h2>Mobil Uyumlu C# Kod Yaz\u0131m\u0131nda Nelere Dikkat Edilmeli?<\/h2>\n<p>Mobil uygulamalar veya mobil cihazlara hizmet veren arka u\u00e7 sistemleri geli\u015ftirirken, bellek kullan\u0131m\u0131 ve performans, masa\u00fcst\u00fc uygulamalar\u0131ndan \u00e7ok daha kritik hale gelir. C#\u2019taki <code>record<\/code>, <code>class<\/code> ve <code>struct<\/code> se\u00e7imleri, mobil ortamlardaki uygulaman\u0131z\u0131n enerji t\u00fcketimini, yan\u0131t verme h\u0131z\u0131n\u0131 ve genel kullan\u0131c\u0131 deneyimini do\u011frudan etkileyebilir.<\/p>\n<h3>Performans\u0131n Mobil Cihazlarda \u00d6nemi<\/h3>\n<p>Mobil cihazlar genellikle daha k\u0131s\u0131tl\u0131 i\u015flem g\u00fcc\u00fcne ve batarya \u00f6mr\u00fcne sahiptir. Bu nedenle, her bellek tahsisi (heap \u00fczerinde <code>class<\/code> veya <code>record class<\/code> kullan\u0131ld\u0131\u011f\u0131nda), her \u00e7\u00f6p toplama i\u015flemi ve her veri kopyalama (b\u00fcy\u00fck <code>struct<\/code>'larda) uygulaman\u0131z\u0131n performans\u0131n\u0131 olumsuz etkileyebilir. \u00d6zellikle:<\/p>\n<ul>\n<li><strong>Bellek Ayak \u0130zi:<\/strong> Daha az heap tahsisi, \u00e7\u00f6p toplay\u0131c\u0131n\u0131n daha az \u00e7al\u0131\u015fmas\u0131 anlam\u0131na gelir. Bu da CPU d\u00f6ng\u00fclerinden tasarruf sa\u011flar ve uygulaman\u0131n daha ak\u0131c\u0131 \u00e7al\u0131\u015fmas\u0131na yard\u0131mc\u0131 olur. K\u00fc\u00e7\u00fck <code>struct<\/code>'lar bu konuda avantajl\u0131 olabilir.<\/li>\n<li><strong>Veri Aktar\u0131m\u0131:<\/strong> Mobil uygulamalar genellikle bir arka u\u00e7 API'si ile etkile\u015fime girer. Bu API'lardan gelen verileri modellemek i\u00e7in <code>record<\/code>'lar (\u00f6zellikle <code>record class<\/code>) idealdir. De\u011fi\u015fmezlikleri sayesinde, al\u0131nan verinin beklenmedik \u015fekilde de\u011fi\u015ftirilmedi\u011finden emin olabilir ve de\u011fer tabanl\u0131 e\u015fitlik sayesinde verileri kolayca kar\u015f\u0131la\u015ft\u0131rabilirsiniz. Bu, veri tutarl\u0131l\u0131\u011f\u0131 ve hata ay\u0131klama kolayl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan mobil uygulamalarda b\u00fcy\u00fck bir art\u0131d\u0131r.<\/li>\n<li><strong>Kopyalama Maliyetleri:<\/strong> E\u011fer \u00e7ok say\u0131da k\u00fc\u00e7\u00fck veri yap\u0131s\u0131 ile s\u0131k\u00e7a i\u015flem yap\u0131l\u0131yorsa (\u00f6rne\u011fin, oyun veya grafik uygulamalar\u0131nda <code>Vector2D<\/code> gibi), <code>struct<\/code> kullanmak, heap tahsisini azaltarak performans art\u0131\u015f\u0131 sa\u011flayabilir. Ancak, b\u00fcy\u00fck <code>struct<\/code>'lardan ka\u00e7\u0131nmak esast\u0131r, \u00e7\u00fcnk\u00fc kopyalama maliyeti referans kopyalamadan daha y\u00fcksek hale gelebilir.<\/li>\n<\/ul>\n<p>\u00d6rnek bir senaryoda, bir mobil uygulaman\u0131n API'den \u00fcr\u00fcn listesini \u00e7ekti\u011fini d\u00fc\u015f\u00fcnelim. Her bir \u00fcr\u00fcn\u00fcn, yaln\u0131zca g\u00f6r\u00fcnt\u00fclenmek \u00fczere k\u0131sa \u00f6m\u00fcrl\u00fc bir nesne olarak kullan\u0131ld\u0131\u011f\u0131 durumlarda, <code>record<\/code> kullan\u0131m\u0131 idealdir. \u00c7\u00fcnk\u00fc de\u011fi\u015fmezdirler, de\u011fer tabanl\u0131 e\u015fitlik sa\u011flarlar ve genellikle basit DTO'lar i\u00e7in optimize edilmi\u015f bir s\u00f6zdizimi sunarlar.<\/p>\n<pre><code>\n    \/\/ Mobil uygulama i\u00e7in API'dan gelen \u00fcr\u00fcn verilerini temsil eden Record\n    public record MobileProductDTO(int Id, string Name, decimal Price, string ImageUrl);\n\n    \/\/ Bir API \u00e7a\u011fr\u0131s\u0131 sonucu elde edilen veri\n    var productData = new MobileProductDTO(1, \"Ak\u0131ll\u0131 Telefon\", 7500M, \"http:\/\/example.com\/phone.jpg\");\n\n    \/\/ Mobil uygulamada kullan\u0131lacak basit bir konum struct'\u0131\n    \/\/ S\u0131k\u00e7a olu\u015fturulup kopyalanaca\u011f\u0131ndan struct burada avantajl\u0131 olabilir\n    public readonly struct ScreenPosition\n    {\n        public int X { get; }\n        public int Y { get; }\n\n        public ScreenPosition(int x, int y) => (X, Y) = (x, y);\n    }\n\n    var touchPos = new ScreenPosition(150, 200);\n    <\/pre>\n<p><\/code><\/p>\n<p>Mobil uyumlu HTML \u00fcretme konusunda, C# kodunun do\u011frudan HTML ile ili\u015fkisi olmasa da, bir C# geli\u015ftiricisi olarak web aray\u00fczleri geli\u015ftirirken responsive design prensiplerini bilmek \u00f6nemlidir. Yukar\u0131daki CSS \u00f6rne\u011fi, web sitelerinin farkl\u0131 ekran boyutlar\u0131na nas\u0131l uyum sa\u011flayabilece\u011fini g\u00f6stermektedir. C# ile backend geli\u015ftirirken de, mobil uygulamalar\u0131n ihtiya\u00e7 duydu\u011fu optimize edilmi\u015f ve hafif JSON\/XML yan\u0131tlar\u0131 d\u00f6nd\u00fcrmek, <code>record<\/code>'lar\u0131 kullanarak veri modellerini sadele\u015ftirmek gibi yakla\u015f\u0131mlar \u00f6nemlidir.<\/p>\n<h2>Sonu\u00e7: C# Veri Modellerinde Ustal\u0131k<\/h2>\n<p>C# dilinde <code>record<\/code>, <code>class<\/code> ve <code>struct<\/code>, veri modelleme i\u00e7in geli\u015ftiricilere g\u00fc\u00e7l\u00fc ve esnek se\u00e7enekler sunar. Her birinin kendine \u00f6zg\u00fc tasar\u0131m\u0131 ve davran\u0131\u015fsal \u00f6zellikleri vard\u0131r, bu da onlar\u0131 farkl\u0131 kullan\u0131m senaryolar\u0131 i\u00e7in uygun hale getirir. Bu makale boyunca, bu \u00fc\u00e7 yap\u0131n\u0131n temel farklar\u0131n\u0131, ne zaman hangi yap\u0131y\u0131 tercih etmeniz gerekti\u011fini ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131n\u0131 detayl\u0131ca inceledik. \u00d6zellikle, <code>class<\/code>'lar\u0131n referans tabanl\u0131 karma\u015f\u0131k nesneler i\u00e7in, <code>struct<\/code>'lar\u0131n k\u00fc\u00e7\u00fck ve performans kritik de\u011fer tipleri i\u00e7in ve <code>record<\/code>'lar\u0131n ise de\u011fi\u015fmez veri ta\u015f\u0131ma nesneleri ve de\u011fer odakl\u0131 modeller i\u00e7in ideal oldu\u011funu vurgulad\u0131k.<\/p>\n<p>Anahtar \u00e7\u0131kar\u0131m \u015fudur: Tek bir \"en iyi\" se\u00e7enek yoktur. Karar, modellemek istedi\u011finiz verinin do\u011fas\u0131na, uygulaman\u0131z\u0131n performans beklentilerine, bellek kullan\u0131m\u0131na ve kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fine ba\u011fl\u0131d\u0131r. Do\u011fru se\u00e7imi yapmak, yaln\u0131zca kodunuzun daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamakla kalmaz, ayn\u0131 zamanda daha okunabilir, bak\u0131m\u0131 kolay ve hataya daha az yatk\u0131n bir uygulama geli\u015ftirmenize de yard\u0131mc\u0131 olur. Bu derinlemesine bilgi birikimiyle, C# projelerinizde veri modellerinizi daha bilin\u00e7li ve stratejik bir \u015fekilde tasarlayabilirsiniz.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<h3>1. Struct'lar neden null olamaz?<\/h3>\n<p><code>struct<\/code>'lar de\u011fer tipleri oldu\u011fu i\u00e7in, do\u011frudan bir de\u011fer tutarlar ve bellekte bir varl\u0131k olarak her zaman mevcutlard\u0131r. Bir <code>struct<\/code> \u00f6rne\u011fi olu\u015fturdu\u011funuzda, t\u00fcm alanlar\u0131 varsay\u0131lan de\u011ferleriyle ba\u015flat\u0131l\u0131r. <code>null<\/code>, bir referans\u0131n hi\u00e7bir nesneyi i\u015faret etmedi\u011fi durumu ifade eder. <code>struct<\/code>'lar referans olmad\u0131\u011f\u0131 i\u00e7in <code>null<\/code> olamazlar. Ancak, <code>Nullable<T><\/code> (\u00f6rne\u011fin <code>int?<\/code> veya <code>MyStruct?<\/code>) kullanarak bir <code>struct<\/code>'\u0131 null yap\u0131labilir hale getirebilirsiniz.<\/p>\n<pre><code>\n    struct MyStruct { public int Value; }\n    MyStruct s1 = new MyStruct(); \/\/ Value = 0\n    \/\/ MyStruct s2 = null; \/\/ Hata verir\n    MyStruct? s3 = null; \/\/ Ge\u00e7erli\n    <\/pre>\n<p><\/code><\/p>\n<h3>2. Record'lar Class gibi metot i\u00e7erebilir mi?<\/h3>\n<p>Evet, <code>record<\/code>'lar (<code>record class<\/code> ve <code>record struct<\/code> fark etmeksizin) aynen <code>class<\/code>'lar ve <code>struct<\/code>'lar gibi metotlar, \u00f6zellikler, constructor'lar, interface uygulamalar\u0131 ve hatta alanlar i\u00e7erebilirler. Temel fark, <code>record<\/code>'lar\u0131n de\u011fer tabanl\u0131 e\u015fitlik, <code>ToString()<\/code> metodu override'\u0131 ve <code>with<\/code> ifadesi gibi baz\u0131 \u00fcye metotlar\u0131 ve operat\u00f6rleri otomatik olarak sa\u011flamas\u0131d\u0131r. Bu otomatik implementasyonlar, veri odakl\u0131 tipler i\u00e7in ya\u015fam kalitesini art\u0131r\u0131r.<\/p>\n<h3>3. B\u00fcy\u00fck Struct'lar kullanmak neden k\u00f6t\u00fc bir fikir olabilir?<\/h3>\n<p>B\u00fcy\u00fck <code>struct<\/code>'lar, temel olarak kopyalama maliyeti nedeniyle performans sorunlar\u0131na yol a\u00e7abilir. Bir <code>struct<\/code> kopyaland\u0131\u011f\u0131nda (bir de\u011fi\u015fkene atand\u0131\u011f\u0131nda, bir metoda parametre olarak ge\u00e7ti\u011finde veya bir metoddan d\u00f6nd\u00fc\u011f\u00fcnde), t\u00fcm verinin kendisi kopyalan\u0131r. E\u011fer <code>struct<\/code> b\u00fcy\u00fckse (\u00f6rne\u011fin, birden fazla referans tipine veya \u00e7ok say\u0131da alana sahipse), bu kopyalama i\u015flemi \u00f6nemli CPU ve bellek bant geni\u015fli\u011fi t\u00fcketebilir. Ayr\u0131ca, b\u00fcy\u00fck <code>struct<\/code>'lar bazen heap'te de tutulmak zorunda kalabilir (boxing), bu da \u00e7\u00f6p toplama y\u00fck\u00fcn\u00fc art\u0131r\u0131r. Genellikle, 16 byte'tan b\u00fcy\u00fck <code>struct<\/code>'lar i\u00e7in <code>class<\/code> veya <code>record class<\/code> kullanmak daha iyi bir tercih olabilir.<\/p>\n<h3>4. Referans tipler ve de\u011fer tipleri aras\u0131ndaki temel fark nedir?<\/h3>\n<p>En temel fark, bellekte nas\u0131l davrand\u0131klar\u0131d\u0131r. <strong>De\u011fer tipleri<\/strong> (<code>struct<\/code>, <code>int<\/code>, <code>bool<\/code> vb.), verinin kendisini do\u011frudan depolarlar. Bir de\u011fer tipi de\u011fi\u015fkene atand\u0131\u011f\u0131nda veya bir fonksiyona ge\u00e7irildi\u011finde, verinin bir kopyas\u0131 olu\u015fturulur. <strong>Referans tipleri<\/strong> (<code>class<\/code>, <code>record class<\/code>, <code>string<\/code>, diziler vb.), verinin kendisini de\u011fil, verinin bellekte (heap) nerede sakland\u0131\u011f\u0131na dair bir referans\u0131 (adresi) depolarlar. Bir referans tipi de\u011fi\u015fkene atand\u0131\u011f\u0131nda veya bir fonksiyona ge\u00e7irildi\u011finde, yaln\u0131zca bu referans kopyalan\u0131r; orijinal veri ayn\u0131 kal\u0131r. Bu durum, referans tiplerinin <code>null<\/code> olabilmesini de sa\u011flar.<\/p>\n<h3>5. C# 10 ile gelen record struct ne i\u015fe yarar?<\/h3>\n<p>C# 10 ile tan\u0131t\u0131lan <code>record struct<\/code>, <code>record<\/code>'lar\u0131n sundu\u011fu de\u011fer tabanl\u0131 e\u015fitlik, <code>with<\/code> ifadesi gibi \u00f6zelliklerini bir <code>struct<\/code>'\u0131n de\u011fer tipi davran\u0131\u015f\u0131yla birle\u015ftirir. Bu, geli\u015ftiricilere de\u011fi\u015fmez, de\u011fer tabanl\u0131 e\u015fitli\u011fe sahip ancak heap tahsisinden ka\u00e7\u0131nan k\u00fc\u00e7\u00fck veri yap\u0131lar\u0131 olu\u015fturma olana\u011f\u0131 sunar. Genellikle, performans kritik senaryolarda k\u00fc\u00e7\u00fck, de\u011fi\u015fmez de\u011fer tipleri i\u00e7in <code>record struct<\/code> ideal bir se\u00e7imdir, \u00e7\u00fcnk\u00fc hem <code>struct<\/code>'\u0131n bellek avantajlar\u0131n\u0131 hem de <code>record<\/code>'\u0131n kod okunabilirli\u011fi ve g\u00fcvenli\u011fini bir araya getirir. \u00d6zellikle DTO'lar\u0131n bellek ayak izini minimize etmek istendi\u011finde kullan\u0131labilir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"C# geli\u015ftiricileri i\u00e7in Record, Class ve Struct aras\u0131ndaki temel farklar\u0131, ne zaman hangisini kullanman\u0131z gerekti\u011fini ve performans ipu\u00e7lar\u0131n\u0131&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[228],"tags":[],"class_list":{"0":"post-31851","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-c","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar<\/title>\n<meta name=\"description\" content=\"C# geli\u015ftiricileri i\u00e7in Record, Class ve Struct aras\u0131ndaki temel farklar\u0131, ne zaman hangisini kullanman\u0131z gerekti\u011fini ve performans ipu\u00e7lar\u0131n\u0131 bu kapsaml\u0131 rehberde ke\u015ffedin. Bu \u00fc\u00e7 farkl\u0131 veri modelleme yakla\u015f\u0131m\u0131, uygulaman\u0131z\u0131n performans\u0131n\u0131, bellek kullan\u0131m\u0131n\u0131 ve kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fini do\u011frudan etkileyebilir.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar\" \/>\n<meta property=\"og:description\" content=\"C# geli\u015ftiricileri i\u00e7in Record, Class ve Struct aras\u0131ndaki temel farklar\u0131, ne zaman hangisini kullanman\u0131z gerekti\u011fini ve performans ipu\u00e7lar\u0131n\u0131 bu kapsaml\u0131 rehberde ke\u015ffedin. Bu \u00fc\u00e7 farkl\u0131 veri modelleme yakla\u015f\u0131m\u0131, uygulaman\u0131z\u0131n performans\u0131n\u0131, bellek kullan\u0131m\u0131n\u0131 ve kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fini do\u011frudan etkileyebilir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-14T18:31:33+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar\",\"datePublished\":\"2025-10-14T18:31:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/\"},\"wordCount\":4499,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"C#\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/\",\"name\":\"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-14T18:31:33+00:00\",\"description\":\"C# geli\u015ftiricileri i\u00e7in Record, Class ve Struct aras\u0131ndaki temel farklar\u0131, ne zaman hangisini kullanman\u0131z gerekti\u011fini ve performans ipu\u00e7lar\u0131n\u0131 bu kapsaml\u0131 rehberde ke\u015ffedin. Bu \u00fc\u00e7 farkl\u0131 veri modelleme yakla\u015f\u0131m\u0131, uygulaman\u0131z\u0131n performans\u0131n\u0131, bellek kullan\u0131m\u0131n\u0131 ve kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fini do\u011frudan etkileyebilir.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar","description":"C# geli\u015ftiricileri i\u00e7in Record, Class ve Struct aras\u0131ndaki temel farklar\u0131, ne zaman hangisini kullanman\u0131z gerekti\u011fini ve performans ipu\u00e7lar\u0131n\u0131 bu kapsaml\u0131 rehberde ke\u015ffedin. Bu \u00fc\u00e7 farkl\u0131 veri modelleme yakla\u015f\u0131m\u0131, uygulaman\u0131z\u0131n performans\u0131n\u0131, bellek kullan\u0131m\u0131n\u0131 ve kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fini do\u011frudan etkileyebilir.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/","og_locale":"tr_TR","og_type":"article","og_title":"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar","og_description":"C# geli\u015ftiricileri i\u00e7in Record, Class ve Struct aras\u0131ndaki temel farklar\u0131, ne zaman hangisini kullanman\u0131z gerekti\u011fini ve performans ipu\u00e7lar\u0131n\u0131 bu kapsaml\u0131 rehberde ke\u015ffedin. Bu \u00fc\u00e7 farkl\u0131 veri modelleme yakla\u015f\u0131m\u0131, uygulaman\u0131z\u0131n performans\u0131n\u0131, bellek kullan\u0131m\u0131n\u0131 ve kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fini do\u011frudan etkileyebilir.","og_url":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-14T18:31:33+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar","datePublished":"2025-10-14T18:31:33+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/"},"wordCount":4499,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["C#"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/","url":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/","name":"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-14T18:31:33+00:00","description":"C# geli\u015ftiricileri i\u00e7in Record, Class ve Struct aras\u0131ndaki temel farklar\u0131, ne zaman hangisini kullanman\u0131z gerekti\u011fini ve performans ipu\u00e7lar\u0131n\u0131 bu kapsaml\u0131 rehberde ke\u015ffedin. Bu \u00fc\u00e7 farkl\u0131 veri modelleme yakla\u015f\u0131m\u0131, uygulaman\u0131z\u0131n performans\u0131n\u0131, bellek kullan\u0131m\u0131n\u0131 ve kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fini do\u011frudan etkileyebilir.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/c-record-class-ve-struct-kapsamli-rehber-ve-farklar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"C# Record, Class ve Struct: Kapsaml\u0131 Rehber ve Farklar"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31851","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31851"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31851\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}