Yükleniyor...

C# Record Types ve Immutable Nesneler

C# record type ve immutable nesneleri öğrenin. Değişmez veri modeli, value equality ve with ifadeleriyle modern C# pratiklerini keşfedin.

C# 9 ile birlikte gelen record türleri, özellikle immutable (değiştirilemez) nesneler oluşturmayı kolaylaştırır. Record türleri, sınıflara benzer şekilde veri ve davranış içerebilir; ancak öncelikli amaçları veri taşıyan nesneleri (data models, DTO’lar vb.) daha kolay, güvenli ve okunabilir şekilde tanımlamaktır. Immutable nesneler, oluşturulduktan sonra değerleri değiştirilemeyen nesnelerdir. Bu yaklaşım özellikle çoklu iş parçacığında (multi-threading) güvenliği artırır ve hata riskini azaltır.


Record Nedir?

record anahtar kelimesi, sınıf veya struct benzeri veri tipleri tanımlamak için kullanılır. Varsayılan olarak değer tabanlı eşitlik (value-based equality) sağlar. Yani iki record nesnesinin alanları aynıysa, nesneler eşit kabul edilir.


public record Person(string Name, int Age);

class Program
{
    static void Main()
    {
        var p1 = new Person("Ali", 30);
        var p2 = new Person("Ali", 30);

        Console.WriteLine(p1 == p2); // True (değer tabanlı karşılaştırma)
    }
}

Immutable Özellikler

Record türlerinde özellikler varsayılan olarak init accessor ile tanımlanabilir. Bu sayede nesne oluşturulurken değer atanır, sonrasında değiştirilemez.


public record Product
{
    public string Name { get; init; } = string.Empty;
    public decimal Price { get; init; }
}

class Program
{
    static void Main()
    {
        var p = new Product { Name = "Kalem", Price = 12.5m };
        Console.WriteLine($"{p.Name} - {p.Price} TL");

        // p.Price = 15m; // Derleme hatası! (init-only property)
    }
}

with İfadesi

Record türlerinde with ifadesi kullanılarak mevcut nesneden kopya oluşturulabilir ve sadece istenen alan değiştirilebilir. Bu, immutable nesnelerle çalışırken çok kullanışlıdır.


var p1 = new Product { Name = "Defter", Price = 45m };

// with ifadesiyle kopya oluştur ve Price değerini değiştir
var p2 = p1 with { Price = 40m };

Console.WriteLine(p1.Price); // 45
Console.WriteLine(p2.Price); // 40

Record Class ve Record Struct

C# 10 ile birlikte record struct desteği gelmiştir. Yani record sadece class tabanlı değil, değer tipi tabanlı da olabilir. record class referans tiptir, record struct ise değer tipidir.


public record struct Point(int X, int Y);

class Program
{
    static void Main()
    {
        var a = new Point(1, 2);
        var b = new Point(1, 2);

        Console.WriteLine(a == b); // True (değer tabanlı eşitlik)
    }
}

Immutable Nesnelerin Avantajları


Örnek: Immutable Veri Modeli

Aşağıdaki örnekte Order nesnesi immutable olarak tanımlanmış ve with ifadesiyle yeni sürümleri üretilmiştir.


public record Order(int Id, string Customer, decimal Amount);

class Program
{
    static void Main()
    {
        var o1 = new Order(1, "Ahmet", 500m);
        Console.WriteLine(o1);

        // with ifadesiyle kopya oluştur
        var o2 = o1 with { Amount = 600m };
        Console.WriteLine(o2);
    }
}
// Çıktı:
Order { Id = 1, Customer = Ahmet, Amount = 500 }
Order { Id = 1, Customer = Ahmet, Amount = 600 }

TL;DR

  • record: Değer tabanlı eşitlik sağlayan yeni tip.
  • init özellikler: Nesne oluşturulurken atanır, sonra değiştirilemez.
  • with ifadesi: Immutable nesnelerden kopya türetmek için kullanılır.
  • record class = referans tipi, record struct = değer tipi.
  • Immutable nesneler thread-safe, güvenli ve okunabilir bir model sunar.

İlişkili Makaleler