Kayıtlar (C# başvurusu)

C# 9'dan başlayarak anahtar sözcüğünü kullanarak verileri kapsülleme için yerleşik işlevsellik sağlayan bir record başvuru türü tanımlarsiniz. Konumsal parametreleri veya standart özellik söz dizimi kullanarak sabit özelliklere sahip kayıt türleri oluşturabilirsiniz:

public record Person(string FirstName, string LastName);
public record Person
{
    public string FirstName { get; init; } = default!;
    public string LastName { get; init; } = default!;
};

Table özellikleri ve alanları ile kayıt türleri de oluşturabilirsiniz:

public record Person
{
    public string FirstName { get; set; } = default!;
    public string LastName { get; set; } = default!;
};

Kayıtlar değiştirilebilir olabilir ancak öncelikli olarak sabit veri modellerini desteklemeye yöneliktir. Kayıt türü aşağıdaki özellikleri sunar:

Yapı türlerini, değer eşitliği ve çok az davranış sağlayan veya hiç davranış olmayan veri merkezli türler tasarlamak için de kullanabilirsiniz. C# 10 ve üzerinde konumsal parametreleri veya standart özellik söz dizimi record struct kullanarak türleri tanımlayabilirsiniz:

public readonly record struct Point(double X, double Y, double Z);
public record struct Point
{
    public double X {  get; init; }
    public double Y {  get; init; }
    public double Z {  get; init; }
}

Hem konumsal kayıt yapılarını hem de konumsal parametresiz kayıt yapılarını da kayıt yapılarını değiştirebilir:

public record struct DataMeasurement(DateTime TakenAt, double Measurement);
public record struct Point
{
    public double X { get; set; }
    public double Y { get; set; }
    public double Z { get; set; }
}

Yukarıdaki örneklerde başvuru türleri olan kayıtlar ile değer türleri olan kayıtlar arasındaki bazı farklar verilmiştir:

  • A record veya bir başvuru türünü record class bildirer. anahtar class sözcüğü isteğe bağlıdır, ancak okuyucular için netlik ekleyebilir. bir record struct değer türü bildirer.
  • Konumsal özellikler ve içinde record class readonly record struct sabittir. Bunlar bir içinde table'dır. record struct

Bu makalenin geri kalanında hem hem de türleri record class ele record struct alır. Farklar her bölümde ayrıntılı olarak açıktır. ile arasında karar vermek için ile arasında seçim yapmaya record class benzer bir karar ver record struct class struct gerekir. Kayıt terimi, tüm kayıt türleri için geçerli olan davranışı açıklamak için kullanılır. veya, record struct record class sırasıyla yalnızca yapı veya sınıf türleri için geçerli olan davranışı açıklamak için kullanılır.

Özellik tanımı için konumsal söz dizimi

Konumsal parametreleri kullanarak bir kaydın özelliklerini bildirebilirsiniz ve bir örnek oluşturmada özellik değerlerini başlatabilirsiniz:

public record Person(string FirstName, string LastName);

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

Özellik tanımı için konumsal sözdizimini kullanırken, derleyici şunları oluşturur:

  • Kayıt bildiriminde sağlanan her konumsal parametre için genel bir yalnızca init-only otomatik uygulanan özelliği.
    • Türler ve türler için: Yalnızca init özelliği yalnızca oluşturucuda veya record readonly record struct özellik başlatıcısı kullanılarak ayarlanabilirsiniz.
    • Türler için: Oluşturucuda, özellik başlatıcıda veya oluşturma sonrasında record struct atamada ayarlan bir okuma-yazma özelliği.
  • Parametreleri kayıt bildiriminde konumsal parametrelerle eşan birincil oluşturucu.
  • Kayıt yapı türleri için, her alanı varsayılan değerine ayar alan parametresiz bir oluşturucu.
  • Kayıt Deconstruct bildiriminde out sağlanan her konumsal parametre için parametresi olan bir yöntem. Bu yöntem yalnızca iki veya daha fazla konumsal parametre varsa sağlanır. yöntemi konumsal söz dizimi kullanılarak tanımlanan özellikleri yoklar; Standart özellik söz dizimi kullanılarak tanımlanan özellikleri yok sayar.

Derleyicinin kayıt tanımından oluşturduğu bu öğelerden herhangi biri için öznitelikler eklemek istiyor olabilir. Konumsal kaydın özelliklerine uygulayan herhangi bir öznitelik için hedef ekebilirsiniz. Aşağıdaki örnek, System.Text.Json.Serialization.JsonPropertyNameAttribute kaydının her özelliğine Person uygular. Hedef, property: özniteliğin derleyici tarafından oluşturulan özelliğe uygulandığını gösterir. Diğer field: değerler, özniteliğini alana uygulamak ve param: özniteliği parametresine uygulamaktır.

/// <summary>
/// Person record type
/// </summary>
/// <param name="FirstName">First Name</param>
/// <param name="LastName">Last Name</param>
/// <remarks>
/// The person type is a positional record containing the
/// properties for the first and last name. Those properties
/// map to the JSON elements "firstName" and "lastName" when
/// serialized or deserialized.
/// </remarks>
public record Person([property: JsonPropertyName("firstName")]string FirstName, 
    [property: JsonPropertyName("lastName")]string LastName);

Yukarıdaki örnekte ayrıca kayıt için XML belge açıklamalarını oluşturma adımları da yer almaktadır. Birincil oluşturucu <param> parametrelerinin belgelerini eklemek için etiketini ekebilirsiniz.

Oluşturulan otomatik uygulanan özellik tanımı istediğiniz gibi değilse, aynı adla kendi özelliğinizi tanımlayabilirsiniz. Bunu yaparsanız, oluşturulan oluşturucu ve yıkıcı özellik tanımınızı kullanır. Örneğin, aşağıdaki örnek konum kaydının FirstName ve LastName özelliklerini bildirse de, konum public Id parametresini ile internal kısıtlar. Kayıtlar ve kayıt yapı türleri için bu söz dizimlerini kullanabilirsiniz. Bildirilen özelliğin ilgili konum parametresine açık atamasını eklemeniz gerekir.

public record Person(string FirstName, string LastName, string Id)
{
    internal string Id { get; init; } = Id;
}

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

}

Bir kayıt türünün herhangi bir konumsal özellik bildiren olması gerekir. Herhangi bir konumsal özellik olmadan bir kayıt bildirebilirsiniz ve aşağıdaki örnekte olduğu gibi diğer alanları ve özellikleri bildirebilirsiniz:

public record Person(string FirstName, string LastName)
{
    public string[] PhoneNumbers { get; init; } = Array.Empty<string>();
};

Özellikleri standart özellik söz dizimi kullanarak tanımlar ancak erişim değiştiricisini atlarsanız, özellikler örtülü olarak ' private dır.

Değiştirilemezlik

Konumsal kayıt ve konumsal salt okunur kayıt yapı, salt okunur özellikleri bildirer. Konumsal kayıt yapı, okuma-yazma özelliklerini bildirer. Önceki bölümde gösterildiği gibi bu varsayılan değerlerden birini geçersiz kılabilirsiniz.

İş parçacığı güvenli olması için veri merkezli bir türe ihtiyacınız olduğunda veya karma tabloda aynı kalan karma koda bağlıyken sabitlik yararlı olabilir. Ancak, sabitlik tüm veri senaryoları için uygun değildir. Entity Framework Core,sabit varlık türleriyle güncelleştirmeyi desteklemez.

Konumsal parametrelerden ( ve ) veya erişimci belirterek oluşturulan yalnızca init özellikleri record class readonly record struct basit init sabittir. Başlatmadan sonra, değer türü özelliklerinin değerini veya başvuru türü özelliklerinin başvurularını değiştiremezsiniz. Ancak, başvuru türü özelliğinin başvurduğu veriler değiştirilebilir. Aşağıdaki örnek, başvuru türü sabit bir özelliğin (bu örnekte bir dizi) içeriğinin değiştirilebilir olduğunu gösterir:

public record Person(string FirstName, string LastName, string[] PhoneNumbers);

public static void Main()
{
    Person person = new("Nancy", "Davolio", new string[1] { "555-1234" });
    Console.WriteLine(person.PhoneNumbers[0]); // output: 555-1234

    person.PhoneNumbers[0] = "555-6789";
    Console.WriteLine(person.PhoneNumbers[0]); // output: 555-6789
}

Kayıt türlerine özgü özellikler derleyici sentezlenmiş yöntemler tarafından uygulanır ve bu yöntemlerin hiçbiri nesne durumunu değiştirerek sabitliği tehlikeye atamaz. Belirtilmezse, sentezlenmiş yöntemler , ve bildirimleri record record struct için readonly record struct oluşturulur.

Değer eşitliği

Tanımladığınız herhangi bir tür için , ve aşırı Object.Equals(Object) yüklemesi geçersiz operator == kılabileceğiniz. Geçersiz kılmaz veya aşırı Equals operator == yüklenilmiyorsa, tanımlandığı tür eşitliği yönetir:

  • Türler class için, bellekte aynı nesneye başvuran iki nesne eşittir.
  • Türler struct için, aynı türde olan ve aynı değerleri depolarsa iki nesne eşittir.
  • ve record dahil olmak üzere record struct readonly record struct türler için, aynı türde olan ve aynı değerleri depolarsa iki nesne eşittir.

için eşitlik tanımı record struct ile struct aynıdır. Fark, bir için struct uygulamanın içinde yer alan ValueType.Equals(Object) ve yansımaya bağlı olduğudur. Kayıtlar için, uygulama derleyici sentezlenmiş ve bildirilen veri üyelerini kullanır.

Bazı veri modelleri için başvuru eşitliği gereklidir. Örneğin, Entity Framework Core varlık türü için yalnızca bir varlık örneği kullandığına emin olmak için başvuru eşitliği bağlıdır. Bu nedenle kayıtlar ve kayıt yapılarının, kayıt yapılarında varlık türleri olarak Entity Framework Core.

Aşağıdaki örnek, kayıt türlerinin değer eşitliğini gösterir:

public record Person(string FirstName, string LastName, string[] PhoneNumbers);

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
}

Derleyici, değer eşitliğini uygulamak için aşağıdaki yöntemleri sentezler:

Kendi uygulamalarınızı yazarak bu sentezlenmiş yöntemlerden herhangi birini değiştirebilirsiniz. Bir kayıt türünün sentezlenmiş herhangi bir yöntemin imzasıyla eşleşen bir yöntemi varsa, derleyici bu yöntemi sentezlemez.

Kendi uygulamanızı bir kayıt Equals türünde sağlarsanız, bir de uygulaması GetHashCode sağlar.

Yıkıcılık yok

Bazı değişikliklerle bir örneği kopyalamanız gerekirse, yıkıcı bir sonuç elde etmek için with bir ifade kullanabilirsiniz. İfade, with belirtilen özellikler ve alanları değiştirilmiş mevcut bir kayıt örneğinin kopyası olan yeni bir kayıt örneği yapar. Nesne başlatıcı söz dizimi, aşağıdaki örnekte gösterildiği gibi değiştirilen değerleri belirtmek için kullanılır:

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

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
}

İfade, with standart özellik söz dizimi kullanılarak oluşturulan konumsal özellikleri veya özellikleri ayarlayabilirsiniz. Konumsal olmayan özelliklerin bir ifadede init set değiştirilene bir veya erişimcisi with olması gerekir.

İfadenin sonucu with basit bir kopyadır. Bu, başvuru özelliği için yalnızca bir örneğin başvurusu kopyalanır. Hem özgün kayıt hem de kopya aynı örnek için bir başvuru ile birlikte olur.

Derleyici, türler için record class bu özelliği uygulamak için kopya yöntemini ve kopya oluşturucusu sentezler. Sanal kopyalama yöntemi, kopya oluşturucusu tarafından başlatılan yeni bir kayıt döndürür. Bir with ifade kullandığınızda, derleyici Clone metodunu çağıran ve sonra ifadede belirtilen özellikleri ayarlayan kodu oluşturur with .

Farklı kopyalama davranışına ihtiyacınız varsa, kendi kopya oluşturucunuzu bir içinde yazabilirsiniz record class . Bunu yaparsanız, derleyici bir tane birleştirmez. privateKayıt varsa oluşturucuyu yapın sealed , aksi takdirde yapın protected . Derleyici, türler için bir kopya Oluşturucu birleştirmez record struct . Bir tane yazabilirsiniz, ancak derleyici bu ifadeye ifadeler için çağrı oluşturmaz with . Bunun yerine, derleyici atama kullanır.

Clone yöntemini geçersiz kılamazsınız ve herhangi bir kayıt türünde adlı bir üye oluşturamazsınız Clone . Kopya yönteminin gerçek adı derleyici tarafından oluşturulmuştur.

Görüntüleme için yerleşik biçimlendirme

Kayıt türlerinde ToString , ortak özelliklerin ve alanların adlarını ve değerlerini görüntüleyen bir derleyici tarafından oluşturulan yöntem vardır. ToStringYöntemi aşağıdaki biçimde bir dize döndürür:

<record type name> { <property name> = <value>, <property name> = <value>, ...}

Başvuru türleri için, özelliğin başvurduğu nesnenin tür adı, özellik değeri yerine görüntülenir. Aşağıdaki örnekte, dizi bir başvuru türüdür, bu nedenle System.String[] gerçek dizi öğesi değerleri yerine görüntülenir:

Person { FirstName = Nancy, LastName = Davolio, ChildNames = System.String[] }

Bu özelliği, türler ' de uygulamak için, record class derleyici sanal bir PrintMembers yöntemi ve bir ToString geçersiz kılmayı birleştirir. Türler ' de record struct , bu üye private . ToStringGeçersiz kılma, StringBuilder tür adı ve ardından bir açılış ayracı ile bir nesne oluşturur. PrintMembersÖzellik adları ve değerler eklemek için öğesini çağırır, sonra da kapanış ayracını ekler. Aşağıdaki örnek, sentezleştirilmiş geçersiz kılmanın neleri içerdiğini gösteren kodu gösterir:

public override string ToString()
{
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.Append("Teacher"); // type name
    stringBuilder.Append(" { ");
    if (PrintMembers(stringBuilder))
    {
        stringBuilder.Append(" ");
    }
    stringBuilder.Append("}");
    return stringBuilder.ToString();
}

Kendi uygulamanızı PrintMembers veya ToString geçersiz kılma işlemini sağlayabilirsiniz. Örnekler, bu makalenin ilerleyen kısımlarında PrintMembers türetilen kayıtlardaki biçimlendirme bölümünde verilmiştir. C# 10 ve üzeri sürümlerde, uygulamanız, ToString sealed derleyicinin ToString türetilmiş kayıtlar için bir uygulamayı birleştirmelerini önleyen değiştirici içerebilir. Etkin bir deyişle, ToString Çıkış çalışma zamanı türü bilgilerini içermez. (Tüm üyeler ve değerler görüntülenir, çünkü türetilen kayıtlar hala oluşturulan bir PrintMembers yöntemi olacaktır.)

Devralma

Bu bölüm yalnızca türler için geçerlidir record class .

Bir kayıt, başka bir kayıttan devralınabilir. Ancak, bir kayıt bir sınıftan devralınabilir ve bir sınıf bir kayıttan devralınabilir.

Türetilmiş kayıt türlerinde Konumsal parametreler

Türetilmiş kayıt, temel kayıt birincil oluşturucusunda bulunan tüm parametrelerin konumsal parametrelerini bildirir. Temel kayıt bu özellikleri bildirir ve başlatır. Türetilmiş kayıt onları gizlemez, ancak temel kaydında bildirilmeyen parametreler için Özellikler oluşturur ve başlatır.

Aşağıdaki örnek, konumsal Özellik söz dizimi ile devralmayı göstermektedir:

public abstract record Person(string FirstName, string LastName);
public record Teacher(string FirstName, string LastName, int Grade)
    : Person(FirstName, LastName);
public static void Main()
{
    Person teacher = new Teacher("Nancy", "Davolio", 3);
    Console.WriteLine(teacher);
    // output: Teacher { FirstName = Nancy, LastName = Davolio, Grade = 3 }
}

Devralma hiyerarşilerinde eşitlik

Bu bölüm türler için geçerlidir record class , ancak türler için geçerlidir record struct . İki kayıt değişkeninin eşit olması için, çalışma zamanı türünün eşit olması gerekir. Kapsayan değişkenlerin türleri farklı olabilir. Devralınan eşitlik karşılaştırması aşağıdaki kod örneğinde gösterilmektedir:

public abstract record Person(string FirstName, string LastName);
public record Teacher(string FirstName, string LastName, int Grade)
    : Person(FirstName, LastName);
public record Student(string FirstName, string LastName, int Grade)
    : Person(FirstName, LastName);
public static void Main()
{
    Person teacher = new Teacher("Nancy", "Davolio", 3);
    Person student = new Student("Nancy", "Davolio", 3);
    Console.WriteLine(teacher == student); // output: False

    Student student2 = new Student("Nancy", "Davolio", 3);
    Console.WriteLine(student2 == student); // output: True
}

Örnekte, Person örneği türetilmiş bir tür olsa da, tüm değişkenler olarak belirtilir Student Teacher . Örnekler aynı özelliklere ve aynı özellik değerlerine sahiptir. Ancak student == teacher , False her ikisi de Person -tür değişkenleri olsa da student == student2 , True biri Person değişken ve diğeri bir Student değişken olsa da döndürür. Eşitlik testi, değişkenin belirtilen türü değil, gerçek nesnenin çalışma zamanı türüne bağlıdır.

Bu davranışı uygulamak için derleyici, EqualityContract kaydın türüyle eşleşen bir nesne döndüren bir özelliği sentezler Type . , Eşitlik EqualityContract için Denetim yaparken nesnelerin çalışma zamanı türünü karşılaştırmak için eşitlik yöntemlerinin kullanılmasını sağlar. Bir kaydın temel türü ise, object Bu özellik olur virtual . Temel tür başka bir kayıt türü ise, bu özellik bir geçersiz kılma olur. Kayıt türü ise, sealed Bu özellik olur sealed .

Türetilmiş bir türün iki örneğini karşılaştırırken, birleştirilmiş eşitlik yöntemleri temel ve türetilmiş türlerin tüm özelliklerini bir eşitlik için denetler. Sentezlenmiş GetHashCode Yöntem, GetHashCode temel türde ve türetilmiş kayıt türünde belirtilen tüm özelliklerden ve alanlardan yöntemini kullanır.

with türetilmiş kayıtlardaki ifadeler

Bir ifadenin sonucu, with ifadenin işleneni ile aynı çalışma zamanı türüne sahiptir. Çalışma zamanı türünün tüm özellikleri kopyalanırlar, ancak aşağıdaki örnekte gösterildiği gibi yalnızca derleme zamanı türünün özelliklerini ayarlayabilirsiniz:

public record Point(int X, int Y)
{
    public int Zbase { get; set; }
};
public record NamedPoint(string Name, int X, int Y) : Point(X, Y)
{
    public int Zderived { get; set; }
};

public static void Main()
{
    Point p1 = new NamedPoint("A", 1, 2) { Zbase = 3, Zderived = 4 };

    Point p2 = p1 with { X = 5, Y = 6, Zbase = 7 }; // Can't set Name or Zderived
    Console.WriteLine(p2 is NamedPoint);  // output: True
    Console.WriteLine(p2);
    // output: NamedPoint { X = 5, Y = 6, Zbase = 7, Name = A, Zderived = 4 }

    Point p3 = (NamedPoint)p1 with { Name = "B", X = 5, Y = 6, Zbase = 7, Zderived = 8 };
    Console.WriteLine(p3);
    // output: NamedPoint { X = 5, Y = 6, Zbase = 7, Name = B, Zderived = 8 }
}

PrintMembers türetilmiş kayıtlarda biçimlendirme

PrintMembersTüretilmiş bir kayıt türünün sentezlenmiş yöntemi temel uygulamayı çağırır. Sonuç ToString olarak, aşağıdaki örnekte gösterildiği gibi, hem türetilmiş hem de temel türlerin tüm ortak özellikleri ve alanları çıkışa dahil edilir:

public abstract record Person(string FirstName, string LastName);
public record Teacher(string FirstName, string LastName, int Grade)
    : Person(FirstName, LastName);
public record Student(string FirstName, string LastName, int Grade)
    : Person(FirstName, LastName);

public static void Main()
{
    Person teacher = new Teacher("Nancy", "Davolio", 3);
    Console.WriteLine(teacher);
    // output: Teacher { FirstName = Nancy, LastName = Davolio, Grade = 3 }
}

Yöntemi için kendi uygulamanızı sağlayabilirsiniz PrintMembers . Bunu yaparsanız, aşağıdaki imzayı kullanın:

  • sealedÖğesinden türetilen bir kayıt için object (bir temel kayıt bildirmez): private bool PrintMembers(StringBuilder builder) ;
  • Başka bir sealed Kayıttan türetilen kayıt için: protected sealed override bool PrintMembers(StringBuilder builder) ;
  • sealedNesnesinden türetilmiş ve türetilen bir kayıt için:protected virtual bool PrintMembers(StringBuilder builder);
  • Başka bir kayıttan olmayan ve türetilen bir kayıt için sealed : protected override bool PrintMembers(StringBuilder builder);

İşte, PrintMembers biri nesneden türeyen bir kayıt türü için ve diğeri başka bir kayıttan türetilen kayıt türü için, birleştirilmiş yöntemlerin yerini alan bir kod örneği:

public abstract record Person(string FirstName, string LastName, string[] PhoneNumbers)
{
    protected virtual bool PrintMembers(StringBuilder stringBuilder)
    {
        stringBuilder.Append($"FirstName = {FirstName}, LastName = {LastName}, ");
        stringBuilder.Append($"PhoneNumber1 = {PhoneNumbers[0]}, PhoneNumber2 = {PhoneNumbers[1]}");
        return true;
    }
}

public record Teacher(string FirstName, string LastName, string[] PhoneNumbers, int Grade)
    : Person(FirstName, LastName, PhoneNumbers)
{
    protected override bool PrintMembers(StringBuilder stringBuilder)
    {
        if (base.PrintMembers(stringBuilder))
        {
            stringBuilder.Append(", ");
        };
        stringBuilder.Append($"Grade = {Grade}");
        return true;
    }
};

public static void Main()
{
    Person teacher = new Teacher("Nancy", "Davolio", new string[2] { "555-1234", "555-6789" }, 3);
    Console.WriteLine(teacher);
    // output: Teacher { FirstName = Nancy, LastName = Davolio, PhoneNumber1 = 555-1234, PhoneNumber2 = 555-6789, Grade = 3 }
}

Not

C# 10 ve sonrasında derleyici, PrintMembers bir temel kayıt yöntemi Mühürlenmeye sahip olduğunda senkidir ToString . Ayrıca kendi uygulamanızı oluşturabilirsiniz PrintMembers .

Türetilmiş kayıtlarda Oluşturucu kaldırma davranışı

DeconstructTüretilmiş bir kaydın yöntemi, derleme zamanı türünün tüm konumsal özelliklerinin değerlerini döndürür. Değişken türü bir temel kayıt ise, nesne türetilmiş türe yayınlanmadığı müddetçe yalnızca temel kayıt özellikleri kaldırılır. Aşağıdaki örnekte, türetilmiş bir kayıttaki bir Deconstructor çağrısı gösterilmektedir.

public abstract record Person(string FirstName, string LastName);
public record Teacher(string FirstName, string LastName, int Grade)
    : Person(FirstName, LastName);
public record Student(string FirstName, string LastName, int Grade)
    : Person(FirstName, LastName);

public static void Main()
{
    Person teacher = new Teacher("Nancy", "Davolio", 3);
    var (firstName, lastName) = teacher; // Doesn't deconstruct Grade
    Console.WriteLine($"{firstName}, {lastName}");// output: Nancy, Davolio

    var (fName, lName, grade) = (Teacher)teacher;
    Console.WriteLine($"{fName}, {lName}, {grade}");// output: Nancy, Davolio, 3
}

Genel kısıtlamalar

Bir türün kayıt olmasını gerektiren genel kısıtlama yoktur. Kayıtlar class veya struct kısıtlamasını karşılar. Belirli bir kayıt türü hiyerarşisinde kısıtlama yapmak için, kısıtlamayı temel bir sınıf olacak şekilde temel kayda koyun. Daha fazla bilgi için bkz. tür parametrelerindeki kısıtlamalar.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtiminin sınıflar bölümüne bakın.

C# 9 ve sonraki sürümlerde tanıtılan özellikler hakkında daha fazla bilgi için aşağıdaki özellik teklifi notlarına bakın:

Ayrıca bkz.