C#’da Record Yapısı

C#'da Record Yapısı
C#'da Record Yapısı
Yazılım Kodu Kanalına Abone Olun

Herkese merhaba, Bu yazıda C#’da Record yapısı ile ilgili bilgi vermeye çalışacağım.

C# 9.0 sürümüyle birlikte, “record” tipi eklenmiştir. “record” tipi, genellikle değişmez (immutable) veri yapılarını ifade etmek için kullanılır ve sıklıkla veri taşıma amacıyla tercih edilir. Record tipi, sınıf (class) türüne benzese de birkaç önemli farkı vardır.

İşte “record” tipinin temel özellikleri:

  1. Değişmezlik (Immutable): Record tipleri genellikle değişmezdir, yani bir kez oluşturulduktan sonra içindeki veriler değiştirilemez.
  2. Deconstructing (Parçalama): Record tipleri, içerdikleri verileri hızlı bir şekilde parçalayabilmenizi sağlayan “Deconstruct” özelliğini destekler.
  3. Pattern Matching (Desen Eşleme): Record tipleri, C# 9.0 ile birlikte gelen desen eşleme özellikleriyle uyumludur.
  4. Value Equality (Değer Eşitliği): Record tipleri, içerdikleri verilere dayalı olarak otomatik olarak değer eşitliği sağlar.

Değiştirilemezlik (Immutable), bir nesnenin oluşturulduktan sonra içindeki durumunun (state) değiştirilemez olduğu bir özelliktir. Bu, bir kez oluşturulan nesnenin değerlerinin sonradan değiştirilemeyeceği ve herhangi bir değişiklik yapılmak istendiğinde yeni bir nesne oluşturularak bu değişikliğin gerçekleştirileceği anlamına gelir.

Değiştirilemez nesnelerin temel özellikleri şunlardır:

  1. Durumun Değiştirilememesi: Bir kez oluşturulan değiştirilemez nesnenin içindeki veriler değiştirilemez. Bu, nesnenin ömrü boyunca aynı kalmasını sağlar.
  2. Yeni Nesne Oluşturma: Herhangi bir değişiklik yapılması gerektiğinde, var olan nesnenin değerlerini değiştirmek yerine, yeni bir nesne oluşturularak bu değişiklik yapılır.
  3. Güvenilirlik: Değiştirilemez nesneler, oluşturuldukları andaki durumu korur. Bu durum, programın beklenmedik hatalarla karşılaşmasını önler ve daha güvenilir bir kod yazmayı sağlar.
  4. Thread Safety (İş Parçacığı Güvenliği): Değiştirilemez nesneler, çoklu iş parçacığı ortamlarında güvenli bir şekilde paylaşılabilir, çünkü içindeki durumu değiştirme riski yoktur.
  5. Kod Tasarımı: Değiştirilemezlik, kodun daha sade, okunabilir ve anlaşılır olmasına katkıda bulunabilir. Değişmeyen veri yapıları, programın durumunu güvenilir bir şekilde yönetmeye yardımcı olabilir.

Bu özellik, genellikle programlama dilindeki belirli tipler veya veri yapıları için kullanılır ve kodun güvenilirliğini, anlaşılabilirliğini ve sürdürülebilirliğini artırabilir. C# programlama dilinde “record” tipleri, genellikle değiştirilemez nesneleri temsil etmek için kullanılan bir örnektir.

Deconstructing” (parçalama), C# programlama dilinde bir nesnenin içindeki verileri, bu verileri tek tek ayrı değişkenlere atamak için kullanılan bir özelliktir. Bu, özellikle tuple, record veya sınıf gibi nesnelerin içindeki verilere kolayca erişmek ve kullanmak için kullanılır.

Deconstructing işlemi, bir nesnenin içindeki elemanları, ilgili değişkenlere atamak için özel olarak tanımlanan bir deconstructing metodu ile gerçekleşir. Bu sayede, kodunuz daha okunabilir hale gelir ve veriye erişim daha kolay bir hale gelir.

Pattern matching, bir programlama dilinde belirli desenlere uyan veri yapılarını tanıma ve bu desenlere göre işlem yapma yeteneğidir. C# programlama dilinde, pattern matching, C# 7.0 sürümüyle birlikte tanıtılmış ve daha sonra güncellenmiştir. Bu özellik, switch ifadeleri, if ifadeleri, is ve when anahtar kelimeleri gibi çeşitli yapılar aracılığıyla uygulanabilir.

Pattern matching’in temel amacı, bir nesnenin veya ifadenin içeriğini belirli desenlere göre kontrol etmektir. Bu desenler, tipler, yapılar, özellikler, diziler, sıralar, null değerler, ve daha pek çok durumu içerebilir. Bu sayede, kodunuz daha esnek ve okunabilir hale gelir:

Value equality (değer eşitliği), iki nesnenin değerlerinin eşit olup olmadığını kontrol etmek anlamına gelir. Bu, nesnelerin referans eşitliği (reference equality) ile karıştırılmamalıdır. Value equality, nesnelerin içindeki verilere dayalı olarak eşit olup olmadıklarını değerlendirir.

C# programlama dilinde, Object.Equals metodu ve == operatörü varsayılan olarak referans eşitliğini kontrol eder. Ancak, birçok durumda bu, iki nesnenin içindeki verilere göre eşit olup olmadığını belirlemede yeterli değildir. Value equality kavramı, bu durumu ele almak için kullanılır.

Bir sınıfın değer eşitliğini sağlamak için Equals metodu üzerrideği gibi, == operatörünü doğru bir şekilde kullanarak sağlamak için == operatörünü override etmek gerekir. Ayrıca, GetHashCode metodunu uygun bir şekilde implemente etmek de önemlidir.

public record Person(string FirstName, string LastName, int Age);

class Program
{
    static void Main()
    {
        // Record örneği oluşturma
        Person person1 = new Person("Yavuz Selim", "Kart", 35);
        Person person2 = new Person("Yavuz Selim", "Tantoğlu", 37);

        // Value equality kontrolü
        if (person1 == person2)
        {
            Console.WriteLine("İki kişi aynı!");
        }
        else
        {
            Console.WriteLine("İki kişi farklı!");
        }

        // Deconstructing (Parçalama) örneği
        var (firstName, lastName, age) = person1;
        Console.WriteLine($"Ad: {firstName}, Soyad: {lastName}, Yaş: {age}");
    }
}

Bu örnekte, Person adında bir record tanımlanmıştır. Records, içerdikleri özelliklere dayalı olarak otomatik olarak değer eşitliği sağlar. Bu nedenle, person1 ve person2 örnekleri oluşturulduktan sonra, == operatörü ile değer eşitliği kontrolü gerçekleştirilir.

Ayrıca, Person record’u deconstructing (parçalama) özelliğini de kullanır. var (firstName, lastName, age) = person1; satırıyla person1 örneğinin içindeki değerleri firstName, lastName ve age değişkenlerine atayabiliriz.

Bu örnekte record’lar, kodun daha sade ve okunabilir olmasını sağlar ve otomatik olarak değer eşitliği ile değişmezliği destekler.

record tipi, özellikle aşağıdaki durumlar için kullanışlıdır.

Değer Taşıma: Eğer sadece veri taşımak için bir sınıf veya yapı kullanmanız gerekiyorsa, record tipi uygun bir seçenektir. Bu durumda, record tipi ile daha sade ve okunabilir bir kod yazabilirsiniz.

public record Person(string FirstName, string LastName, int Age);

Değer Eşitliği Kontrolü: Eğer nesnelerin içindeki verilere dayalı olarak değer eşitliği kontrolü yapmanız gerekiyorsa, record tipi bu işlemi otomatik olarak sağlar.

Person person1 = new Person("Yavuz Selim", "Kart", 30);
Person person2 = new Person("Yavuz Selim", "Kart", 30);

if (person1 == person2)
{
    // İki kişi aynı!
}

Değiştirilemezlik İhtiyacı: Eğer nesnelerinizin değiştirilemez olmasını istiyorsanız, record tipi with anahtar kelimesi ile mevcut bir nesnenin kopyasını alıp belirli alanları güncelleyerek değiştirilemez nesneler oluşturmanıza olanak tanır.

Person originalPerson = new Person("Yavuz Selim", "Kart", 30);
Person updatedPerson = originalPerson with { Age = 31 };

Sade ve Okunabilir Kod İhtiyacı: record tipi, değer eşitliği ve diğer özellikleri otomatik olarak sağladığı için kodunuzu daha sade ve okunabilir hale getirebilir.

public record Person(string FirstName, string LastName, int Age);

Ancak, record tipini her zaman kullanmak gerekli değildir. Özellikle karmaşık işlemler, özel durumlar veya nesnenin davranışlarını özelleştirmeniz gereken durumlar için, geleneksel sınıflar veya yapılar daha uygun olabilir. record tipi, genellikle basit veri taşıma senaryoları ve değer eşitliği ihtiyaçları için idealdir.

Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.

Yavuz Selim Kart

Yazılım ve veri tabanında bildiklerimi anlatmaya gayret ediyorum. Halen birçok programlama dili üzerinde araştırmalar yaparak kendimi geliştiriyorum. Bunlar haricinde Grafik Tasarım ve Wordpress konularına da ilgim bulunmakta. SEO ve Sosyal medya yönetimleri hakkında da bilgim mevcuttur. Kısaca çok çalışmayı seven azimli biriyim.

Aşağıdaki yazıları da inceleyebilirsiniz...

Sitedeki yazıları kopyalamak yasaktır.