Yükleniyor...

Record’lar

C# dilinde Record’lar, nesne tabanlı programlamada veri modellerini daha güvenli, okunabilir ve yönetilebilir hale getiren özel bir türdür. C# 9.0 ile tanıtılan Record’lar, temel olarak değer temelli eşitlik ve inmutabilite (değiştirilemezlik) özellikleriyle öne çıkar. Geleneksel sınıflardan farklı olarak, Record’lar aynı veri değerlerine sahip nesnelerin eşit olduğunu otomatik olarak değerlendirir; bu, özellikle koleksiyonlarda, veri karşılaştırmalarında ve algoritmalarda hata olasılığını azaltır.
Record’lar, yazılım mimarisi bağlamında, Domain-Driven Design (DDD), CQRS desenleri, veri transfer objeleri (DTO) ve backend uygulamalarında veri tutarlılığını sağlamak için ideal bir yapıdır. Ayrıca OOP prensiplerini tam anlamıyla destekler: kapsülleme, kalıtım ve metod kullanımını Records’lar üzerinden güvenli bir şekilde uygulamak mümkündür.
Bu eğitimde okuyucu, Record’ların temel ve gelişmiş kullanımını öğrenecek; C# dilinde syntax, veri yapıları, algoritmalar ve OOP prensipleri ile entegre bir şekilde uygulamalar geliştirecek. Temel örneklerden başlayarak, gerçek dünya senaryolarına uygulanabilir pratik örnekler ile Record’lar ile güvenli, okunabilir ve performanslı kod yazma becerisi kazanılacaktır. Ayrıca, sık yapılan hatalar, performans optimizasyonu ve güvenlik önlemleri gibi ileri düzey konulara da değinilecektir.

Temel Örnek

text
TEXT Code
using System;

public record Kisi(string Isim, int Yas);

public class Program
{
public static void Main()
{
Kisi kisi1 = new Kisi("Ali", 28);
Kisi kisi2 = new Kisi("Ali", 28);
Kisi kisi3 = new Kisi("Ayşe", 30);

Console.WriteLine($"kisi1 == kisi2: {kisi1 == kisi2}");
Console.WriteLine($"kisi1 == kisi3: {kisi1 == kisi3}");

Console.WriteLine($"İsim: {kisi1.Isim}, Yaş: {kisi1.Yas}");

Kisi kisi4 = kisi1 with { Yas = 29 };
Console.WriteLine($"kisi4: {kisi4}");
}

}

Bu örnekte, Kisi adında bir Record tanımlandı ve iki özellik içeriyor: Isim ve Yas. Record yapısı sayesinde kisi1 ve kisi2 değer temelli eşitlik ile karşılaştırıldığında true dönerken, kisi3 farklı değerler içerdiği için false döner. public record Kisi(string Isim, int Yas); ifadesi, positional constructor kullanarak kod tekrarını önler ve daha okunabilir bir yapı sağlar.
Record’lar, nesnelerin inmutabilitesini destekler; yani bir nesne oluşturulduktan sonra değerleri doğrudan değiştirilemez. Bu özellik, multithreading veya büyük veri işleme senaryolarında hataları azaltır. with ifadesi, mevcut bir nesneden yeni bir nesne türetip belirli özellikleri değiştirmeye olanak tanır. Bu, algoritmalarda ve veri işleme senaryolarında orijinal nesneleri koruyarak güvenli bir şekilde değişiklik yapmayı sağlar.
Özetle, Record’lar kod okunabilirliğini artırır, boilerplate kod miktarını azaltır ve değer tabanlı eşitlik ile mimari tutarlılığı güçlendirir.

Pratik Örnek

text
TEXT Code
using System;
using System.Collections.Generic;
using System.Linq;

public record Urun(int Id, string Ad, decimal Fiyat);

public class AlisverisSepeti
{
private readonly List<Urun> _urunler = new();

public void UrunEkle(Urun urun)
{
if (_urunler.Any(u => u.Id == urun.Id))
{
Console.WriteLine("Ürün zaten sepette. Tekrar eklenmez.");
return;
}
_urunler.Add(urun);
}

public void SepetiGoster()
{
foreach (var urun in _urunler)
{
Console.WriteLine($"ID: {urun.Id}, Ad: {urun.Ad}, Fiyat: {urun.Fiyat:C}");
}
}

public decimal ToplamFiyatHesapla() =>
_urunler.Sum(u => u.Fiyat);

public AlisverisSepeti IndirimUygula(decimal oran)
{
var yeniUrunler = _urunler
.Select(u => u with { Fiyat = u.Fiyat * (1 - oran) })
.ToList();

var yeniSepet = new AlisverisSepeti();
foreach (var urun in yeniUrunler)
yeniSepet.UrunEkle(urun);

return yeniSepet;
}

}

public class Program
{
public static void Main()
{
var sepet = new AlisverisSepeti();
sepet.UrunEkle(new Urun(1, "Laptop", 15000m));
sepet.UrunEkle(new Urun(2, "Mouse", 150m));
sepet.UrunEkle(new Urun(1, "Laptop", 15000m));

sepet.SepetiGoster();
Console.WriteLine($"Toplam: {sepet.ToplamFiyatHesapla():C}");

var indirimliSepet = sepet.IndirimUygula(0.10m);
Console.WriteLine("İndirimli Sepet:");
indirimliSepet.SepetiGoster();
Console.WriteLine($"Toplam İndirimli: {indirimliSepet.ToplamFiyatHesapla():C}");
}

}

Gerçek dünya senaryolarında, Record’lar ile veri modelleri güvenli ve değiştirilemez şekilde oluşturulabilir. Urun Record’u, ürünün benzersiz özelliklerini içerir ve değer temelli eşitlik sayesinde aynı değerler için çoğaltma önlenir. UrunEkle metodu, tekrar eden ürünleri kontrol ederek veri bütünlüğünü sağlar.
IndirimUygula metodu, with ifadesiyle yeni ürün nesneleri oluşturarak orijinal veriyi değiştirmeden fiyat indirimleri uygular. Bu yöntem, inmutabiliteyi destekler ve algoritmik hataları azaltır. LINQ ile entegrasyon, performanslı ve okunabilir kod yazmayı sağlar. Bu yapı, faturalama, stok yönetimi veya sipariş işleme sistemlerinde rahatlıkla kullanılabilir. Record’lar, OOP prensipleri ve algoritmik optimizasyonla birleştiğinde, sürdürülebilir ve güvenli bir mimari oluşturur.

C# için en iyi uygulamalar ve yaygın hatalar:
Record’lar ile çalışırken inmutabiliteyi korumak kritik önemdedir; property’leri değiştirmek yerine with kullanımı tercih edilmelidir. Değer temelli eşitlik, koleksiyon işlemlerinde ve veri karşılaştırmalarında algoritmaları basitleştirir.
Yaygın hatalar arasında, Record’ların referans tipi olduğunu unutarak struct gibi bellek optimizasyonu beklemek ve with kullanımında giriş doğrulamalarını ihmal etmek yer alır. Performans analizi için profilleme araçları kullanmak, gereksiz kopyaları tespit etmek için önemlidir. Güvenlik açısından, ToString() metodunun hassas verileri otomatik olarak gösterebileceği unutulmamalıdır; gerekirse override edilmelidir. Bu önlemler, Record’lar ile güvenli, performanslı ve okunabilir kod yazımını garanti eder.

📊 Referans Tablosu

C# Element/Concept Description Usage Example
Positional Record Özellikleri ve constructor’ı tek satırda tanımlar public record Kisi(string Isim, int Yas);
with İfadesi Mevcut nesneden yeni nesne üretir var yeniKisi = kisi1 with { Yas = 29 };
Değer Temelli Eşitlik Record’lar için değer bazlı karşılaştırma kisi1 == kisi2 // true
Record Kalıtımı Record’lar arasında hiyerarşi oluşturur public record Ogrenci(string Isim, int Yas, string Sinif) : Kisi(Isim, Yas);
ToString Otomatik Tüm property’leri gösterir Console.WriteLine(kisi1); // "Kisi { Isim = Ali, Yas = 28 }"

Özetle, Record’lar C#’ta modern ve güvenli veri modellemesi sağlar. Değer temelli eşitlik ve inmutabilite, algoritmaların ve veri yapılarının doğruluğunu artırır. Temel syntax’dan gerçek dünya senaryolarına kadar olan örnekler, Record’ların LINQ, OOP ve backend tasarım desenleriyle entegrasyonunu gösterir.
Record’lar sınıfların yerini almak yerine, değer odaklı veri modelleri için tamamlayıcı bir yapı sunar. Bu yapı, kurumsal yazılımlar, dağıtık sistemler ve veri işleme uygulamalarında kullanılabilir.
Sonraki adımlar olarak, init özellikleri, Record’larda pattern matching, kalıtım ve koleksiyonlarla kullanımı gibi konulara çalışmak, Entity Framework Core veya ASP.NET ile entegrasyonu keşfetmek önerilir. Pratik uygulamalarla desteklenen bu öğrenim, C#’ta daha güvenli, okunabilir ve optimize edilmiş çözümler üretme becerisi kazandırır.

🧠 Bilginizi Test Edin

Başlamaya Hazır

Test Your Knowledge

Test your understanding of this topic with practical questions.

4
Sorular
🎯
70%
Geçmek İçin
♾️
Süre
🔄
Deneme

📝 Talimatlar

  • Her soruyu dikkatle okuyun
  • Her soru için en iyi cevabı seçin
  • Quiz'i istediğiniz kadar tekrar alabilirsiniz
  • İlerlemeniz üstte gösterilecek