Aracılığıyla paylaş


C'de kayıt türlerine giriş#

C# dilindeki kayıt, veri modelleriyle çalışmak için özel söz dizimi ve davranış sağlayan bir sınıf veya yapıdır. Değiştirici, record derleyiciye birincil rolü veri depolayan türler için yararlı olan üyeleri sentezlediğini bildirir. Bu üyeler, değer eşitliğini destekleyen ve üyelerinin aşırı yüklemesini ToString() içerir.

Kayıtların ne zaman kullanılacağı

Aşağıdaki senaryolarda bir sınıf veya yapı yerine bir kayıt kullanmayı göz önünde bulundurun:

  • Değer eşitliğine bağlı bir veri modeli tanımlamak istiyorsunuz.
  • Nesnelerin sabit olduğu bir tür tanımlamak istiyorsunuz.

Değer eşitliği

Kayıtlarda değer eşitliği, bir kayıt türünün iki değişkeninin, türler eşleşirse eşit olduğu ve tüm özellik ve alan değerlerinin eşit olduğu anlamına gelir. Sınıflar gibi diğer başvuru türleri için eşitlik, değer eşitliği uygulanmadığı sürece varsayılan olarak başvuru eşitliği anlamına gelir. Diğer bir ifadeyle, bir sınıf türünün iki değişkeni aynı nesneye başvuruda bulunursa eşittir. İki kayıt örneğinin eşitliğini belirleyen yöntemler ve işleçler değer eşitliğini kullanır.

Tüm veri modelleri değer eşitliği ile iyi çalışmaz. Örneğin Entity Framework Core, kavramsal olarak tek bir varlık için varlık türünün yalnızca bir örneğini kullandığından emin olmak için başvuru eşitliğine bağlıdır. Bu nedenle, kayıt türleri Entity Framework Core'da varlık türleri olarak kullanmak için uygun değildir.

Değiştirilemezlik

Sabit tür, bir nesnenin örneğini oluşturduktan sonra herhangi bir özellik veya alan değerini değiştirmenizi engelleyen türdür. Bir türün iş parçacığı açısından güvenli olması gerektiğinde veya karma tabloda aynı kalan bir karma koda bağlı olduğunuzda değiştirilemezlik yararlı olabilir. Kayıtlar sabit türler oluşturmak ve bunlarla çalışmak için kısa söz dizimi sağlar.

Değişmezlik tüm veri senaryoları için uygun değildir. Örneğin Entity Framework Core, sabit varlık türleriyle güncelleştirmeyi desteklemez.

Kayıtların sınıflardan ve yapılardan farkı

Sınıfları veya yapıları bildiren ve örnekleyen söz dizimi kayıtlarla birlikte kullanılabilir. anahtar sözcüğünü class ile recorddeğiştirin veya yerine structkullanınrecord struct. Benzer şekilde, devralma ilişkilerini ifade etmek için aynı söz dizimi kayıt sınıfları tarafından desteklenir. Kayıtlar aşağıdaki yollarla sınıflardan farklıdır:

Kayıt yapıları, derleyicinin eşitlik yöntemlerini sentezlediğini ve ToStringiçindeki yapılardan farklıdır. Derleyici, konumsal kayıt yapıları için bir Deconstruct yöntem sentezler.

Derleyici, içindeki her birincil oluşturucu parametresi için bir genel yalnızca başlatma özelliğini sentezler record class. içinde record struct, derleyici bir genel okuma-yazma özelliğini sentezler. Derleyici, içinde birincil oluşturucu parametreleri class ve struct değiştirici içermeyen record türler için özellikler oluşturmaz.

Örnekler

Aşağıdaki örnek, bir kaydı bildirmek ve örneğini oluşturmak için konumsal parametreler kullanan genel bir kaydı tanımlar. Ardından tür adını ve özellik değerlerini yazdırır:


public record Person(string FirstName, string LastName);

public static class Program
{
    public static void Main()
    {
        Person person = new("Nancy", "Davolio");
        Console.WriteLine(person);
        // output: Person { FirstName = Nancy, LastName = Davolio }
    }

}

Aşağıdaki örnekte kayıtlarda değer eşitliği gösterilmektedir:

public record Person(string FirstName, string LastName, string[] PhoneNumbers);
public static class Program
{
    public static void Main()
    {
        var phoneNumbers = new string[2];
        Person person1 = new("Nancy", "Davolio", phoneNumbers);
        Person person2 = new("Nancy", "Davolio", phoneNumbers);
        Console.WriteLine(person1 == person2); // output: True

        person1.PhoneNumbers[0] = "555-1234";
        Console.WriteLine(person1 == person2); // output: True

        Console.WriteLine(ReferenceEquals(person1, person2)); // output: False
    }
}

Aşağıdaki örnek, sabit bir with nesneyi kopyalamak ve özelliklerden birini değiştirmek için ifade kullanımını gösterir:

public record Person(string FirstName, string LastName)
{
    public required string[] PhoneNumbers { get; init; }
}

public class Program
{
    public static void Main()
    {
        Person person1 = new("Nancy", "Davolio") { PhoneNumbers = new string[1] };
        Console.WriteLine(person1);
        // output: Person { FirstName = Nancy, LastName = Davolio, PhoneNumbers = System.String[] }

        Person person2 = person1 with { FirstName = "John" };
        Console.WriteLine(person2);
        // output: Person { FirstName = John, LastName = Davolio, PhoneNumbers = System.String[] }
        Console.WriteLine(person1 == person2); // output: False

        person2 = person1 with { PhoneNumbers = new string[1] };
        Console.WriteLine(person2);
        // output: Person { FirstName = Nancy, LastName = Davolio, PhoneNumbers = System.String[] }
        Console.WriteLine(person1 == person2); // output: False

        person2 = person1 with { };
        Console.WriteLine(person1 == person2); // output: True
    }
}

Daha fazla bilgi için bkz . Kayıtlar (C# başvurusu).

C# Dil Belirtimi

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.