Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Verileri kapsüllemek için yerleşik işlevsellik sağlayan bir record
tanımlamak için değiştiriciyi kullanırsınız.
Bir kayıtta birincil oluşturucu bildirdiğinizde, derleyici birincil oluşturucu parametreleri için genel özellikler oluşturur. Bir kaydın birincil oluşturucu parametreleri konumsal parametreler olarak adlandırılır. Derleyici, birincil oluşturucuyu veya konumsal parametreleri yansıtan konumsal özellikler oluşturur. Derleyici, değiştiricisi olmayan türlerde birincil oluşturucu parametrelerinin record
özelliklerini sentezlemiyor.
Aşağıdaki iki örnek başvuru türlerini (veya record
) gösterir record class
:
public record Person(string FirstName, string LastName);
public record Person
{
public required string FirstName { get; init; }
public required string LastName { get; init; }
};
Aşağıdaki iki örnek değer türlerini gösterir record struct
:
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; }
}
Ayrıca, değiştirilebilir özelliklere ve alanlara sahip kayıtlar da oluşturabilirsiniz:
public record Person
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
};
Hem konumsal kayıt yapıları hem de konumsal parametre içermeyen kayıt yapıları da değiştirilebilir:
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; }
}
Kayıtlar değişebilir olsa da, bunlar öncelikli olarak sabit veri modellerini desteklemeye yöneliktir. Kayıt türü aşağıdaki özellikleri sunar:
- Sabit özelliklere sahip bir başvuru türü oluşturmak için kısa söz dizimi
- Yerleşik davranış, veri merkezli başvuru türü için kullanışlıdır:
- Devralma hiyerarşileri desteği
Yukarıdaki örneklerde, başvuru türü olan kayıtlarla değer türü olan kayıtlar arasındaki bazı farklar gösterilmektedir:
- A
record
veya a,record class
bir başvuru türü bildirir. Anahtarclass
sözcük isteğe bağlıdır, ancak okuyucular için netlik sağlayabilir. Arecord struct
, bir değer türü bildirir. - Konumsal özellikler . bir .
Bu makalenin geri kalanında hem hem de record class
record struct
türleri ele alınmaktadır. Farklılıklar her bölümde ayrıntılı olarak anlatılır. ile arasında karar vermeniz, ile record class
record struct
arasında class
karar vermeyle benzer bir struct
öğesini belirlemeniz gerekir. Kayıt terimi , tüm kayıt türleri için geçerli olan davranışı tanımlamak için kullanılır. ya da 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 ve alan tanımı için konumsal söz dizimi
Bir kaydın özelliklerini bildirmek veya özellik veya alan değerlerini başlatmak için konumsal parametreleri kullanabilirsiniz. Aşağıdaki örnek, iki konumsal özelliğe sahip bir kayıt oluşturur:
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öz dizimini kullandığınızda, derleyici şunları oluşturur:
- Kayıt bildiriminde sağlanan her konumsal parametre için otomatik olarak uygulanan genel bir özellik.
- Parametreleri kayıt bildirimindeki konumsal parametrelerle eşleşen bir birincil oluşturucu.
- Kayıt yapısı türleri için, her alanı varsayılan değerine ayarlayan parametresiz bir oluşturucu.
-
Deconstruct
Kayıt bildiriminde sağlanan her konumsal parametre için parametresi olan birout
yöntem. yöntemi, konumsal söz dizimi kullanılarak tanımlanan özellikleri yok eder; standart özellik söz dizimi kullanılarak tanımlanan özellikleri yoksayar.
Derleyicinin kayıt tanımından oluşturduğu bu öğelerden herhangi birine öznitelik eklemek isteyebilirsiniz. Konumsal kaydın özelliklerine uyguladığınız herhangi bir özniteliğe hedef ekleyebilirsiniz. Aşağıdaki örnek, kaydın System.Text.Json.Serialization.JsonPropertyNameAttribute her özelliğine Person
öğesini uygular. Hedef, property:
özniteliğin derleyici tarafından oluşturulan özelliğe uygulandığını gösterir. Diğer değerler field:
, özniteliği alana uygulamak ve param:
özniteliğini 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, kayıt için XML belgeleri açıklamalarının nasıl oluşturulacağı da gösterilmektedir. Birincil oluşturucunun <param>
parametrelerine yönelik belgeler eklemek için etiketini ekleyebilirsiniz.
Otomatik uygulanan özellik tanımı istediğiniz gibi değilse, aynı adlı kendi özelliğinizi veya alanınızı tanımlayabilirsiniz. Örneğin, erişilebilirliği veya değişebilirliği değiştirmek ya da get
veya set
erişimcisi için bir uygulama sağlamak isteyebilirsiniz. Üyeyi kaynağınızda bildirirseniz, kaydın konumsal parametresinden başlatmanız gerekir. Özelliğiniz otomatik olarak uygulanan bir özellikse, özelliğini başlatmanız gerekir. Kaynağınıza bir yedekleme alanı eklerseniz, yedekleme alanını başlatmanız gerekir. Oluşturulan deconstructör, özellik veya alan tanımınızı kullanır. Örneğin, aşağıdaki örnek bir konumsal kaydın FirstName
LastName
ve public
özelliklerini bildirir, ancak konum parametresini Id
ile internal
kısıtlar. Kayıtlar ve kayıt yapısı türleri için bu söz dizimini kullanabilirsiniz.
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
}
Özellik yerine alan oluşturmak istiyorsanız, aşağıdaki örnekte gösterildiği gibi konum parametresini bir alana atayın:
public record Person(string FirstName, string LastName, string Id)
{
internal readonly string Id = Id; // this.Id set to parameter Id
}
public static void Main()
{
Person person = new("Nancy", "Davolio", "12345");
Console.WriteLine(person.FirstName); //output: Nancy
}
Kayıt türünün herhangi bir konumsal özellik bildirmesi gerekmez. Herhangi bir konumsal özelliği olmayan bir kayıt bildirebilir 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; } = [];
};
Derleyicinin konumsal parametreler ile oluşturduğu özellikler public
. Erişim değiştiricilerini açıkça bildirdiğiniz özelliklerde bildirirsiniz.
Değiştirilemezlik
konumsal kayıt sınıfı ve yalnızca başlangıç eklemeli özellikleri bildiren konumsal salt okunur kayıt yapısı. Konumsal kayıt yapısı okuma-yazma özelliklerini bildirir. Önceki bölümde gösterildiği gibi bu varsayılan değerlerden birini geçersiz kılabilirsiniz.
Veri merkezli 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. Ancak, 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.
Konumsal parametrelerden (record class
ve readonly record struct
) veya erişimcileri belirterek init
oluşturulan yalnızca başlatma özellikleri, sığ değişmezliğe sahiptir. Başlatma işleminden sonra, değer türü özelliklerinin değerini veya başvuru türü özelliklerinin başvuruyu 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 özelliğinin (bu örnekteki bir dizi) içeriğinin değişebilir 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 tarafından sentezlenen yöntemler tarafından uygulanır ve bu yöntemlerin hiçbiri nesne durumunu değiştirerek değişmezliği tehlikeye atmaz. Belirtilmediği sürece, sentezlenen yöntemler , record
ve record struct
bildirimleri için readonly record struct
oluşturulur.
Değer eşitliği
Eşitlik yöntemlerini geçersiz kılmaz veya değiştirmezseniz, bildirdiğiniz tür eşitliğin nasıl tanımlandığını yönetir:
- Türler için
class
, bellekteki aynı nesneye başvuruda bulunan iki nesne eşittir. - Türler için
struct
iki nesne aynı türdeyse ve aynı değerleri depolarsa eşittir. - Değiştiricisi
record
(record class
,record struct
vereadonly record struct
) olan türler için, aynı türde olan ve aynı değerleri depolayan iki nesne eşittir.
için record struct
eşitlik tanımı, ile struct
aynıdır. Fark, bir struct
için uygulamasının içinde ValueType.Equals(Object) olması ve yansımaya bağlı olmasıdır. Kayıtlar için uygulama derleyici sentezi yapılır ve bildirilen veri üyelerini kullanır.
Bazı veri modelleri için başvuru eşitliği gereklidir. Ö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ıtlar ve kayıt yapıları Entity Framework Core'da varlık türleri olarak kullanmak için uygun değildir.
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
}
Değer eşitliğini uygulamak için derleyici aşağıdakiler dahil olmak üzere çeşitli yöntemleri sentezler:
geçersiz kılma.Object.Equals(Object) Geçersiz kılma açıkça bildirilirse bu bir hatadır.
Bu yöntem, her iki parametre de null olmadığında statik yöntemin temeli Object.Equals(Object, Object) olarak kullanılır.
Bir
virtual
, veyasealed
,Equals(R? other)
buradaR
kayıt türüdür. Bu yöntem uygular IEquatable<T>. Bu yöntem açıkça bildirilebilir.Kayıt türü bir temel kayıt türünden
Base
türetilmişse, .Equals(Base? other)
Geçersiz kılma açıkça bildirilirse bu bir hatadır. kendi uygulamanızıEquals(R? other)
sağlarsanız, uygulamasını da sağlayınGetHashCode
.geçersiz kılma.Object.GetHashCode() Bu yöntem açıkça bildirilebilir.
ve
==
işleçlerinin!=
geçersiz kılmaları. İşleçler açıkça bildirilirse bu bir hatadır.Kayıt türü bir temel kayıt türünden türetilmişse,
protected override Type EqualityContract { get; };
. Bu özellik açıkça bildirilebilir. Daha fazla bilgi için bkz . Devralma hiyerarşilerinde eşitlik.
Kayıt türü açıkça bildirilmesine izin verilen bir sentezlenmiş yöntemin imzası ile eşleşen bir yönteme sahip olduğunda derleyici bir yöntemi sentezlemiyor.
Yok edici mutasyon
Bir örneği bazı değişikliklerle kopyalamanız gerekiyorsa, yıkıcı olmayan mutasyonawith
için bir ifade kullanabilirsiniz. İfade with
, belirtilen özelliklerin ve alanların değiştirildiği mevcut bir kayıt örneğinin kopyası olan yeni bir kayıt örneği oluşturur. Aşağıdaki örnekte gösterildiği gibi değiştirilecek değerleri belirtmek için nesne başlatıcı söz dizimini kullanırsınız:
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 ayarlayabilir. Açıkça bildirilen özelliklerin ifadede değiştirilmesi için bir init
set
veya with
erişimcisi olmalıdır.
İfadenin with
sonucu basit bir kopyadır, yani bir başvuru özelliği için yalnızca bir örneğe başvuru kopyalanır. Hem özgün kayıt hem de kopya aynı örneğe başvuruyla sonuçlanacak.
Bu özelliği türler için uygulamak için record class
derleyici bir kopyalama yöntemini ve bir kopya oluşturucuyu sentezler. Sanal kopya yöntemi, kopya oluşturucu tarafından başlatılan yeni bir kayıt döndürür. bir with
ifade kullandığınızda, derleyici clone yöntemini çağıran bir kod oluşturur ve ardından ifadede with
belirtilen özellikleri ayarlar.
Farklı kopyalama davranışına ihtiyacınız varsa, içinde kendi kopya oluşturucunuzu record class
yazabilirsiniz. Bunu yaparsanız, derleyici bir tane sentezlemiyor. Kayıt ise private
oluşturucunuzu sealed
yapın, aksi takdirde yapınprotected
. Derleyici, türler için record struct
bir kopya oluşturucuyu sentezlemiyor. Bir tane yazabilirsiniz, ancak derleyici ifadeler için with
buna çağrı oluşturmaz. değerleri record struct
atamada kopyalanır.
Kopyalama yöntemini geçersiz kılamazsınız ve herhangi bir kayıt türünde adlı Clone
bir üye oluşturamazsınız. Kopyalama yönteminin gerçek adı derleyici tarafından oluşturulur.
Görüntüleme için yerleşik biçimlendirme
Kayıt türleri, ortak özelliklerin ve alanların adlarını ve değerlerini görüntüleyen derleyici tarafından oluşturulan ToString bir yönteme sahiptir.
ToString
yöntemi aşağıdaki biçimde bir dize döndürür:
<kayıt türü adı> { <özellik adı> = <değer>, <özellik adı> = <değer>, ...}
için <value>
yazdırılan dize, özelliğin türü için tarafından ToString() döndürülen dizedir. Aşağıdaki örnekte, ChildNames
döndürdüğü System.ArrayToString
bir System.String[]
değeridir:
Person { FirstName = Nancy, LastName = Davolio, ChildNames = System.String[] }
Bu özelliği uygulamak için, derleyici türlerde record class
bir sanal PrintMembers
yöntemi ve geçersiz ToString kılmayı sentezler. Türlerde record struct
, bu üye şeklindedir private
.
Geçersiz kılma, ToString
tür adına ve ardından bir açma köşeli ayracına sahip bir nesne oluşturur StringBuilder . Özellik adlarını ve değerlerini eklemek için çağırır PrintMembers
ve ardından kapanış köşeli ayracı ekler. Aşağıdaki örnekte, sentezlenen geçersiz kılmanın içerdiğine benzer kod gösterilmektedir:
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 geçersiz kılmayı ToString
sağlayabilirsiniz. Örnekler, bu makalenin devamında PrintMembers
türetilmiş kayıtlarda biçimlendirme bölümünde verilmiştir.
ToString
uygulamanız, derleyicinin türetilmiş kayıtlar için bir sealed
uygulamasını sentezlemesini engelleyen ToString
değiştiricisini içerebilir. Tür hiyerarşisi record
boyunca tutarlı bir dize gösterimi oluşturabilirsiniz. (Türetilmiş kayıtlarda yine de tüm türetilmiş özellikler için oluşturulmuş bir PrintMembers
yöntem vardır.)
Devralma
Bu bölüm yalnızca türler için record class
geçerlidir.
Bir kayıt başka bir kayıttan devralabilir. Ancak, bir kayıt bir sınıftan devralamaz ve bir sınıf kayıttan devralamaz.
Türetilmiş kayıt türlerinde konumsal parametreler
Türetilmiş kayıt, temel kayıt birincil oluşturucusunda tüm parametreler için konumsal parametreler bildirir. Temel kayıt bu özellikleri bildirir ve başlatır. Türetilen kayıt bunları gizlemez, ancak yalnızca temel kaydında bildirilmeyen parametreler için özellikler oluşturur ve başlatır.
Aşağıdaki örnek, devralmayı konumsal özellik söz dizimi ile gösterir:
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, ancak türler için record class
geçerli değildir record struct
. İki kayıt değişkeninin eşit olması için çalışma zamanı türünün eşit olması gerekir. İçeren değişkenlerin türleri farklı olabilir. Devralınan eşitlik karşılaştırması aşağıdaki kod örneğinde gösterilmiştir:
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, örnek veya türetilmiş bir türü Person
Student
olsa bile tüm değişkenler olarak Teacher
bildirilir. Örnekler aynı özelliklere ve aynı özellik değerlerine sahiptir. Ancak student == teacher
her ikisi de False
-type değişkenleri olmasına rağmen döndürür Person
ve student == student2
biri True
değişken, diğeri değişken olmasına Person
rağmen döndürürStudent
. Eşitlik testi, değişkenin bildirilen türüne değil gerçek nesnenin çalışma zamanı türüne bağlıdır.
Bu davranışı uygulamak için derleyici, kaydın türüyle eşleşen bir nesne döndüren bir EqualityContract
özelliği sentezlerType. eşitlik EqualityContract
yöntemlerinin, eşitlik denetimi yaparken nesnelerin çalışma zamanı türünü karşılaştırması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üyse, bu özellik bir geçersiz kılmadır. Kayıt türü ise sealed
, türü olduğundan bu özellik etkili bir şekilde sealed
olur sealed
.
Kod türetilmiş bir türün iki örneğini karşılaştırdığında, sentezlenen eşitlik yöntemleri temel ve türetilmiş türlerin tüm veri üyelerini eşitlik açısından denetler. Sentezlenen GetHashCode
yöntem, temel tür ve türetilmiş kayıt türünde bildirilen tüm veri üyelerinden yöntemini kullanır GetHashCode
. ' record
nin veri üyeleri, otomatik olarak uygulanan tüm özellikler için bildirilen tüm alanları ve derleyici tarafından sentezlenen yedekleme alanını içerir.
with
türetilmiş kayıtlardaki ifadeler
bir with
ifadenin sonucu, ifadenin işleneni ile aynı çalışma zamanı türüne sahiptir. Çalışma zamanı türünün tüm özellikleri kopyalanır, 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
Türetilmiş kayıt türünün sentezlenmiş PrintMembers
yöntemi temel uygulamayı çağırır. Sonuç, aşağıdaki örnekte gösterildiği gibi hem türetilmiş hem de temel türlerdeki tüm genel özelliklerin ToString
ve alanların çıktıya dahil edilmiş olmasıdır:
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önteminin kendi uygulamasını PrintMembers
sağlayabilirsiniz. Bunu yaparsanız aşağıdaki imzayı kullanın:
- 'den türetilen bir
sealed
kayıt için (temel kayıt bildirmez):object
;private bool PrintMembers(StringBuilder builder)
- Başka bir kayıttan türetilen bir
sealed
kayıt için (kapsayan türün olduğunusealed
, dolayısıyla yönteminin etkilisealed
olduğunu unutmayın):protected override bool PrintMembers(StringBuilder builder)
; - Olmayan ve nesneden türetilen bir kayıt
sealed
için:protected virtual bool PrintMembers(StringBuilder builder);
- Olmayan ve başka bir kayıttan
sealed
türetilen bir kayıt için:protected override bool PrintMembers(StringBuilder builder);
Bir tane nesneden türetilen kayıt türü için, diğeri de başka bir kayıttan türetilen kayıt türü için olmak üzere sentezlenmiş PrintMembers
yöntemlerin yerini alan bir kod örneği aşağıda verilmiştir:
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
Derleyici, temel kayıt ToString
yöntemini engellediğinde bile türetilmiş kayıtlarda PrintMembers
oluşturur. Kendi uygulamanızı PrintMembers
da oluşturabilirsiniz.
Türetilmiş kayıtlarda yapısızlaştırma davranışı
Deconstruct
Tü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ıtsa, nesne türetilen türe dönüştürülmediği sürece yalnızca temel kayıt özellikleri yok edilir. Aşağıdaki örnek, türetilmiş bir kayıtta bir yıkıcı çağırmayı gösterir.
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
anahtar record
sözcüğü, bir veya class
türü için struct
değiştiricidir. Değiştiricinin record
eklenmesi, bu makalenin önceki bölümlerinde açıklanan davranışı içerir. Kayıt türü gerektiren genel bir kısıtlama yoktur. A record class
, kısıtlamayı class
karşılar. A record struct
, kısıtlamayı struct
karşılar. 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.
Bu özellikler hakkında daha fazla bilgi için aşağıdaki özellik teklifi notlarını inceleyin: