Úvod do záznamů
Záznam je Třída nebo Struktura , která poskytuje speciální syntaxi a chování pro práci s datovými modely.
Kdy použít záznamy
Zvažte použití záznamu místo třídy nebo struktury v následujících scénářích:
- Chcete definovat datový model, který závisí na hodnotě rovnosti hodnot.
- Chcete definovat typ, pro které jsou objekty neměnné.
Hodnota rovnosti
U záznamů hodnota rovnosti znamená, že dvě proměnné typu záznamu jsou stejné, pokud se shodují typy a všechny hodnoty vlastností a polí se shodují. Pro jiné typy odkazů, jako jsou třídy, rovnost znamená odkaz na rovnost. To znamená, že dvě proměnné typu třídy jsou stejné, pokud odkazují na stejný objekt. Metody a operátory, které určují rovnost dvou instancí záznamu, používají rovnost hodnot.
Ne všechny datové modely dobře fungují s rovností hodnot. Například Entity Framework Core závisí na rovnosti referencí, aby se zajistilo, že používá pouze jednu instanci typu entity pro to, co je koncepčně jedna entita. Z tohoto důvodu typy záznamů nejsou vhodné pro použití jako typy entit v Entity Framework Core.
Neměnnost
Neproměnlivý typ je ten, který brání v změně vlastností nebo hodnot polí objektu po jeho vytvoření. Neměnnosti může být užitečné, pokud potřebujete typ, který je bezpečný pro přístup z více vláken, nebo v závislosti na hodnotě hash zbylé v zatřiďovací tabulce. Záznamy poskytují stručnou syntaxi pro vytváření a práci s neměnnými typy.
Neměnnosti není vhodné pro všechny scénáře dat. Entity Framework Corenapříklad nepodporuje aktualizaci s neměnnými typy entit.
Způsob, jakým se záznamy liší od tříd a struktur
Stejná syntaxe, která deklaruje a vytváří instance tříd nebo struktur, se dá použít se záznamy. Stačí nahradit class klíčové slovo pomocí record , nebo record struct místo struct . Podobně je stejná syntaxe pro vyjádření vztahů dědičnosti podporována pomocí tříd záznamů. Záznamy se liší od tříd následujícími způsoby:
- Poziční parametry můžete použít k vytvoření a vytvoření instance typu s neproměnlivými vlastnostmi.
- Stejné metody a operátory, které označují rovnost odkazů nebo nerovnost v třídách (například Object.Equals(Object) a
==), označují rovnost hodnot nebo nerovnost v záznamech. - Můžete použít
withvýraz pro vytvoření kopie neměnných objektů s novými hodnotami ve vybraných vlastnostech. ToStringMetoda záznamu vytvoří formátovaný řetězec, který zobrazuje název typu objektu a názvy a hodnoty všech jeho veřejných vlastností.- Záznam může dědit z jiného záznamu. Záznam nemůže dědit od třídy a třída nemůže dědit z záznamu.
Struktury záznamů se liší od struktur v tom, že kompilátor syntetizuje metody pro rovnost a ToString . Kompilátor syntetizuje Deconstruct metodu pro poziční struktury záznamů.
Příklady
Následující příklad definuje veřejný záznam, který používá poziční parametry k deklaraci a vytvoření instance záznamu. Pak vytiskne název typu a hodnoty vlastností:
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 }
}
Následující příklad ukazuje rovnost hodnot v záznamech:
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
}
Následující příklad ukazuje použití with výrazu ke zkopírování neměnných objektů a změně jedné z vlastností:
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
}
Další informace naleznete v tématu Records (Referenční dokumentace jazyka C#).
Specifikace jazyka C#
Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.