C# record vs class: DTO Tanımlarken Hangisini Tercih Etmeliyiz?

Veri transfer nesneleri (DTO – Data Transfer Object), bir katmandan diğerine veri taşımak için kullanılan sade nesnelerdir. Genellikle controller'lar, API istek/yanıtları, servis sınıfları gibi yerlerde kullanılırlar. Peki C# 9.0 ile gelen record yapısı, DTO tanımı için neden class'a güçlü bir alternatiftir?

Bu yazıda record ve class ile DTO tanımı arasındaki farkları gerçek dünya senaryolarıyla ele alacağız.


1. Temel Tanım

class ile DTO:

public class MusteriDto
{
    public string Adi { get; set; }
    public string TcNo { get; set; }
}

record ile DTO:

public record MusteriDto(string Adi, string TcNo);

record, varsayılan olarak immutable (değiştirilemez) nesneler üretir. DTO’lar için birebir uyumludur.


2. ToString(), equals(), GetHashCode() Avantajları

class ile:

  • ToString() → "Namespace.MusteriDto"
  • equals() → Referans karşılaştırması yapar
  • GetHashCode() → Referansa göre hash üretir

record ile:

  • ToString() → MusteriDto { Adi = Ali, TcNo = 123 }
  • equals() → İçerik karşılaştırması yapar
  • GetHashCode() → Alanlara göre hash hesaplar

Testlerde ve loglamada, record ile elde edilen çıktılar çok daha anlamlıdır.


3. Immutability (Değiştirilemezlik)

class:

var m = new MusteriDto { Adi = "Ali", TcNo = "123" };
m.Adi = "Veli"; // değiştirilebilir

record:

var m = new MusteriDto("Ali", "123");
var m2 = m with { Adi = "Veli" }; // yeni nesne oluşturur

Immutability, özellikle çoklu iş parçacıklı yapılarda ve geçmişe dönük veri kayıtlarında güvenlik sağlar.


4. with İfadesi ile Kolay Kopyalama

var musteri = new MusteriDto("Ali", "123");
var yeniMusteri = musteri with { TcNo = "456" };

class ile aynı şeyi yapmak daha uzun ve karmaşıktır.


5. Kullanım Senaryoları

Senaryo Tercih
API Request / Response DTO ✅ record
CQRS Command / Query modelleri ✅ record
Immutable veri kayıtları / Event log ✅ record
UI ViewModel, değiştirilebilir nesne ➖ class daha uygun

Ne Zaman class Kullanmalı?

  • DTO içinde set ile değişiklik yapılacaksa,
  • UI formlarında doğrudan bağlı kullanılacaksa,
  • Eski .NET Framework (C# 8 ve altı) ile çalışılıyorsa.

Sonuç

C# record, DTO tanımlamak için sade, güvenli ve modern bir çözümdür. Otomatik gelen equals, ToString, with gibi özellikleri sayesinde record, özellikle API geliştirme, CQRS mimarisi, unit testler ve immutable veri yönetimi gibi alanlarda class'a göre büyük avantaj sağlar.

🚀 Eğer DTO’n yalnızca veri taşıyorsa ve değiştirilmeyecekse, record en doğru seçimdir.

Hazır altyapın C# 9.0 ve üzerindeyse, yeni projelerinde record kullanarak kodunu hem sadeleştirebilir hem de daha güvenli hale getirebilirsin.

Telefon +90 505 747 42 84
Email info@devedijital.com
Adres
Tacettin Veli Mahallesi Halit Narin Caddesi Bahadır Plaza Kat:11 Daire:41 38230 Deve Dijital Melikgazi/Kayseri/Türkiye