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ı
- Thread-Safe: Nesneler değişmediği için çoklu iş parçacığında güvenlidir.
- Yan Etki Yok: Fonksiyonel programlama yaklaşımına uygundur; aynı girdi her zaman aynı çıktıyı üretir.
- Daha Kolay Hata Ayıklama: Nesne durumu sabit kaldığından debug süreci kolaylaşır.
- Kod Okunabilirliği: Veri modelleri daha açık ve kısa şekilde tanımlanır.
Ö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.withifadesi: 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
C# Encapsulation, Kalıtım, Polimorfizm
C#’ta encapsulation, kalıtım ve polimorfizmi öğrenin. OOP’nin temel prensiplerini örneklerle anlayıp doğru kullanımını keşfedin.
C# Sınıf (Class), Object, Property ve Metotlar
C#’ta class, object, property ve metot kavramlarını öğrenin. Nesne yönelimli programlamanın temel yapı taşları örneklerle açıklanıyor.