This content originally appeared on DEV Community and was authored by Gülsen Keskin
C# ‘ta Record Type Nedir?
Record anahtar kelimesi, geleneksel class yapılarına göre daha sade bir sözdizimi sunarken, kritik özellikleriyle (özellikle imutability ve değer eşitliği) modern yazılım mimarilerinin ihtiyaçlarına cevap verir.
Peki record tam olarak nedir ve neden onu class yerine tercih etmeliyiz?
1. Record Nedir ve Temel Amacı Ne?
record (kayıt), esasen değiştirilemez (immutable) veri modelleri oluşturmak için tasarlanmış bir tiptir. Bir record nesnesi bir kez oluşturulduktan sonra, içerdiği özelliklerin değeri değiştirilemez (doğru şekilde tanımlandığında).
Bu, özellikle veri transfer nesneleri (DTO’lar), API yanıtları veya konfigürasyon ayarları gibi, sadece veri taşımakla yükümlü tiplerde veri güvenliğini ve öngörülebilirliğini artırır.
Temel Tanımlama
Bir record tanımlamak, geleneksel bir sınıfa göre çok daha kısadır.
// Geleneksel Class (Sınıf) Tanımı: Uzun ve Tekrarlayan
public class Employee
{
    public string Name { get; }
    public string Surname { get; }
    public Employee(string name, string surname)
    {
        Name = name;
        Surname = surname;
    }
}
// Record Tanımı (Positional Syntax): Kısa ve Öz
public record EmployeeRecord(string Name, string Surname);
Tek bir satırlık record tanımı, arka planda otomatik olarak Name ve Surname için init erişimcili (sadece başlatma anında değer alabilen) özellikleri ve bu özellikleri alan bir yapıcı (constructor) oluşturur.
2. Record’ların Class’lardan Ayrıldığı Temel Özellikler
record‘ları bu kadar güçlü yapan, derleyicinin arka planda otomatik olarak eklediği üç önemli özelliktir:
A. Değer Eşitliği (Value Equality)
record‘ların en radikal farkı, eşitlik karşılaştırması yapma şeklidir.
- 
Class: Referans Tipi olduğu için, class‘lar Referans Eşitliği kullanır. İki nesne aynı bellek adresini işaret etmiyorsa eşit değildir.
- 
Record: Değer Tipi Eşitliği kullanır. İki recordnesnesinin tüm özellikleri aynı değere sahipse, bu nesneler eşit kabul edilir.
var p1 = new EmployeeRecord("Ayşe", "Kaya");
var p2 = new EmployeeRecord("Ayşe", "Kaya");
var p3 = p1;
Console.WriteLine(p1 == p2); // Sonuç: True (Değerler aynı)
Console.WriteLine(p1 == p3); // Sonuç: True (Referans aynı) 
B. With İfadesi (Non-Destructive Mutation)
record‘lar varsayılan olarak değiştirilemez (immutable) olduğu için, bir nesnenin sadece tek bir özelliğini değiştirmek istediğinizde onu değiştiremezsiniz. Bunun yerine, with ifadesini kullanarak mevcut nesneden yola çıkarak yeni bir kopya oluşturursunuz.
public record Product(int Id, string Name, decimal Price);
var oldProduct = new Product(101, "Monitör", 5000.00m);
// Fiyatı 6000.00 olan yeni bir Product nesnesi oluşturulur:
var newProduct = oldProduct with { Price= 6000.00m };
Console.WriteLine(oldProduct.Price); // Çıktı: 5000.00 (Değişmedi)
Console.WriteLine(newProduct.Price);  // Çıktı: 6000.00 (Yeni kopya)
C. Otomatik ToString()
record‘lar, içerdiği tüm özellik adlarını ve değerlerini gösteren, okunması kolay bir ToString() metodunu otomatik olarak uygular. Bu, hata ayıklama (debugging) sırasında çok büyük bir kolaylık sağlar.
var employee= new EmployeeRecord("Yeşim", "Yılmaz");
Console.WriteLine(employee.ToString()); 
// Çıktı: EmployeeRecord{ Name= Yeşim, Surname= Yılmaz}
3. Ne Zaman Class, Ne Zaman Record Kullanılmalı?
| Senaryo | Class (Sınıf) | Record (Kayıt) | 
|---|---|---|
| Temel Amaç | Davranış, sorumluluk ve durum yönetimi. | Veri taşıma, veri bütünlüğü ve değişmezlik. | 
| Eşitlik | Referans eşitliği (Aynı nesne mi?) | Değer eşitliği (İçerikler aynı mı?) | 
| Değiştirilebilirlik | Varsayılan olarak değiştirilebilir (Mutable). | Varsayılan olarak değiştirilemez (Immutable). | 
| Kullanım Alanları | Servisler, Repositor’ler, UI Bileşenleri, Karmaşık İş Nesneleri. | DTO’lar, Konfigürasyonlar, Modeller, Veri Küpleri. | 
Sonuç
record tipi, C# geliştiricilerine daha az kod yazarak, daha güvenli ve daha anlamlı veri odaklı yapılar oluşturma imkanı sunar. Özellikle mikroservisler ve API geliştirme gibi veri alışverişinin yoğun olduğu modern uygulamalarda veri bütünlüğünü ve kod okunabilirliğini artırmak için ideal bir çözümdür.
This content originally appeared on DEV Community and was authored by Gülsen Keskin
