Ú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 with vý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#.