Bagikan melalui


Pengantar jenis catatan dalam C#

Catatan dalam C# adalah kelas atau struct yang menyediakan sintaks dan perilaku khusus untuk bekerja dengan model data. Pengubah record menginstruksikan pengkompilasi untuk mensintesis anggota yang berguna untuk jenis yang peran utamanya menyimpan data. Anggota ini mencakup kelebihan beban ToString() dan anggota yang mendukung kesetaraan nilai.

Kapan harus menggunakan catatan

Pertimbangkan untuk menggunakan catatan sebagai pengganti kelas atau struct dalam skenario berikut:

  • Anda perlu menentukan model data yang bergantung pada kesamaan nilai.
  • Anda perlu menentukan jenis objek yang tidak dapat diubah.

Kesetaraan nilai

Untuk rekaman, kesetaraan nilai berarti bahwa dua variabel jenis catatan sama jika jenis cocok dan semua nilai properti dan bidang dibandingkan sama. Untuk jenis referensi lain seperti kelas, kesetaraan berarti kesetaraan referensi secara default, kecuali kesetaraan nilai diimplementasikan. Artinya, dua variabel dari jenis kelas adalah sama jika dua variabel merujuk ke objek yang sama. Metode dan operator yang menentukan kesamaan dua instans catatan menggunakan kesamaan nilai.

Tidak semua model data berfungsi dengan baik dengan kesamaan nilai. Misalnya, Entity Framework Core bergantung pada kesamaan referensi untuk memastikan bahwa Entity Framework Core hanya menggunakan satu instans dari jenis entitas untuk apa yang secara konseptual merupakan satu entitas. Karena alasan ini, jenis catatan tidak sesuai untuk digunakan sebagai jenis entitas di Entity Framework Core.

Ketetapan

Jenis yang tidak dapat diubah adalah jenis yang mencegah Anda mengubah properti atau nilai bidang apa pun dari objek setelah objek dibuat. Ketetapan dapat berguna saat Anda membutuhkan jenis untuk menjadi alur-aman atau Anda bergantung pada hash yang tetap sama di tabel hash. Catatan menyediakan sintaks ringkas untuk membuat dan bekerja dengan jenis yang tidak dapat diubah.

Ketetapan tidak sesuai untuk semua skenario data. Entity Framework Core, misalnya, tidak mendukung pembaruan dengan jenis entitas yang tidak dapat diubah.

Bagaimana catatan berbeda dari kelas dan struct

Sintaks yang sama yang mendeklarasikan dan membuat kelas atau struct dapat digunakan dengan catatan. Cukup ganti kata kunci class dengan record, atau gunakan record struct sebagai ganti dari struct. Demikian juga, sintaks yang sama untuk mengekspresikan hubungan pewarisan didukung oleh kelas catatan. Catatan berbeda dari kelas seperti berikut:

  • Anda dapat menggunakan parameter posisional dalam konstruktor utama untuk membuat dan membuat instans jenis dengan properti yang tidak dapat diubah.
  • Metode dan operator yang sama yang menunjukkan kesamaan atau ketidaksamaan referensi dalam kelas (seperti Object.Equals(Object) dan ==), menunjukkan kesamaan atau ketidaksamaan nilai dalam catatan.
  • Anda dapat menggunakan withekspresi untuk membuat salinan objek yang tidak dapat diubah dengan nilai baru di properti yang dipilih.
  • ToString catatan membuat string berformat yang menunjukkan nama jenis objek dan nama serta nilai semua properti publiknya.
  • Catatan dapat mewariskan dari catatan lain. Catatan tidak dapat mewariskan dari kelas, dan kelas tidak dapat mewariskan dari catatan.

Struct catatan berbeda dari struct dalam hal kompilator menyintesis metode untuk kesetaraan, dan ToString. Kompilator menyintesis metode Deconstruct untuk struct catatan posisi.

Kompilator mensintesis properti khusus init publik untuk setiap parameter konstruktor utama dalam record class. record structDalam , kompilator mensintesis properti baca-tulis publik. Pengkompilasi tidak membuat properti untuk parameter konstruktor utama dalam class jenis dan struct yang tidak menyertakan record pengubah.

Contoh

Contoh berikut menentukan catatan publik yang menggunakan parameter posisi untuk mendeklarasikan dan membuat catatan. Contoh berikut kemudian mencetak nama jenis dan nilai properti:


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 }
    }

}

Contoh berikut menunjukkan kesamaan nilai dalam catatan:

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
    }
}

Contoh berikut menunjukkan penggunaan ekspresi with untuk menyalin objek yang tidak dapat diubah dan mengubah salah satu properti:

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
    }
}

Untuk informasi selengkapnya, lihat Catatan (referensi C#).

Spesifikasi Bahasa C#

Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.