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 record
değiştirin veya yerine struct
kullanı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:
- Sabit özelliklere sahip bir tür oluşturmak ve örneği oluşturmak için birincil oluşturucuda konumsal parametreleri kullanabilirsiniz.
- Sınıflarda (ve gibi Object.Equals(Object)
==
) başvuru eşitliğini veya eşitsizliğini belirten aynı yöntemler ve işleçler, kayıtlarda değer eşitliğini veya eşitsizliği gösterir. - Seçili özelliklerde yeni değerlerle sabit bir nesnenin kopyasını oluşturmak için bir ifade kullanabilirsiniz.
with
- Kaydın
ToString
yöntemi, bir nesnenin tür adını ve tüm ortak özelliklerinin adlarını ve değerlerini gösteren biçimlendirilmiş bir dize oluşturur. - Bir kayıt başka bir kayıttan devralabilir. Bir kayıt bir sınıftan devralamaz ve bir sınıf bir kayıttan devralamaz.
Kayıt yapıları, derleyicinin eşitlik yöntemlerini sentezlediğini ve ToString
iç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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin