C# 9 ile gelen record tipleri, özellikle veri taşıyan sınıflarda yazılan kodu büyük ölçüde azaltır. Ancak her sınıfı record yapmak doğru değildir; farkları bilmek gerekir.
Record nedir?
Record, değer eşitliği kullanan bir referans tipidir. İki record'un tüm özellik değerleri aynıysa eşit kabul edilir.
public record Adres(string Il, string Ilce, string Sokak);
var a = new Adres("İstanbul", "Kadıköy", "Moda Cd.");
var b = new Adres("İstanbul", "Kadıköy", "Moda Cd.");
Console.WriteLine(a == b); // True
Aynı tanım class olsaydı sonuç False olurdu; çünkü class'lar varsayılan olarak referans eşitliği kullanır.
Değişmezlik ve with ifadesi
Konumsal (positional) record'larda özellikler varsayılan olarak yalnızca oluşturma sırasında atanabilir. Değişiklik gerektiğinde mevcut nesneyi değiştirmek yerine yeni bir kopya oluşturulur:
var yeniAdres = a with { Ilce = "Üsküdar" };
Bu yaklaşım, verinin beklenmedik yerlerde değişmesinden kaynaklanan hataları azaltır.
record struct
record struct ise değer tipi bir record'dur. Küçük ve sık oluşturulan veri yapılarında bellek açısından avantajlı olabilir.
Ne zaman record?
- DTO'lar: API istek ve cevap modelleri. Bkz. ASP.NET Core Web API.
- Değer nesneleri: Para tutarı, adres, tarih aralığı gibi kimliği değil değeri önemli olan kavramlar.
- Mesajlar ve olaylar: Kuyruklara gönderilen değişmez mesajlar.
- Sorgu sonuçları: Raporlama için okunan salt okunur veriler.
Ne zaman class?
- Kimliği olan, zamanla durumu değişen varlıklar (sipariş, müşteri).
- Entity Framework varlıkları: değişiklik takibi ve referans kimliği nedeniyle class daha uygundur. Bkz. Entity Framework Core.
- Davranışı ağır basan servis sınıfları.
Dikkat edilecekler
- Record içinde liste gibi değiştirilebilir koleksiyonlar varsa, eşitlik karşılaştırması koleksiyonun içeriğini değil referansını karşılaştırır.
withifadesi yüzeysel kopya oluşturur.- Çok büyük record'ları sık kopyalamak performansı etkileyebilir.
Sık sorulan sorular
Record'lar JSON ile sorunsuz çalışır mı?
Evet, System.Text.Json konumsal record'ları serileştirip geri oluşturabilir.
Record'a metot eklenebilir mi?
Evet, record'lar class gibi metot ve ek özellik içerebilir.
Sonuç
Record'lar, veri odaklı kodda daha az yazıp daha güvenli kod üretmenin yoludur. Doğru yerde kullanıldığında kodun niyetini de netleştirir.