Record class menyelesaikan masalah kesetaraan berbasis isi, tetapi tipe tersebut tetap berada di heap. Data kecil yang sering dibuat dan dibuang lebih hemat bila tinggal di stack sebagai struct. Kata kunci record struct menggabungkan kedua keinginan itu: semantik nilai milik struct plus property, Equals, operator ==, dan ToString yang dibangkitkan compiler secara otomatis.

Mendeklarasikan Record Struct #

Contoh berikut mendefinisikan record struct Suhu dengan satu property posisional, lalu menguji penyalinan dan kesetaraannya:

csharp
public record struct Suhu(double Derajat);

Suhu pagi = new Suhu(24.5);
Suhu salinan = pagi;
pagi.Derajat = 28;

Console.WriteLine(pagi);
Console.WriteLine(salinan);
Console.WriteLine(pagi == new Suhu(28));

Output yang Dihasilkan:

text
Suhu { Derajat = 28 }
Suhu { Derajat = 24.5 }
True

Mari kita bedah baris demi baris:

  1. public record struct Suhu(double Derajat);: satu deklarasi menghasilkan struct, constructor berparameter, property Derajat, ToString, serta kesetaraan berbasis isi; tidak ada alokasi object di heap.
  2. Suhu salinan = pagi;: runtime menyalin isi struct, sehingga salinan berdiri sendiri seperti struct biasa.
  3. pagi.Derajat = 28;: property hasil parameter posisional pada record struct berpasangan get; set;, sehingga nilainya boleh ditimpa; salinan tetap 24.5 karena keduanya tidak berbagi data.
  4. pagi == new Suhu(28): operator == yang dibangkitkan membandingkan isi; hasilnya True tanpa kita menulis satu baris method kesetaraan pun.

Membekukan Record Struct #

Property get; set; pada record struct membedakannya dari record class yang property-nya init-only. Bila imutabilitas diinginkan, tambahkan modifier readonly:

csharp
public readonly record struct Suhu(double Derajat);

Dengan modifier tersebut, Derajat menjadi property init-only dan setiap perubahan nilai ditolak compiler. Pola readonly record struct meniru gaya record class yang memang bersifat immutable sejak awal, sehingga banyak tim memakai pola ini sebagai bentuk bawaan untuk data kecil.

Pemilihan antara keduanya mengikuti ukuran data dan cara pemakaiannya. Record struct menyimpan datanya di dalam variable, sehingga cocok untuk nilai berisi satu hingga beberapa field yang ditransfer antar method; record class lebih pas untuk data dengan banyak field atau data yang dikirim ke banyak tempat tanpa ingin tersalin setiap kali berpindah.

Perbandingan Record Class dan Record Struct #

AspekRecord ClassRecord Struct
Keluarga tipeReference type (heap)Value type (stack)
Property posisionalinit-onlyget; set;
Hasil assignmentMenyalin alamat objectMenyalin seluruh isi
Kesetaraan ==Berbasis isiBerbasis isi
Cocok untukData pembawa nilai berukuran berapa punData pembawa nilai yang kecil