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:
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:
Suhu { Derajat = 28 }
Suhu { Derajat = 24.5 }
TrueMari kita bedah baris demi baris:
public record struct Suhu(double Derajat);: satu deklarasi menghasilkan struct, constructor berparameter, propertyDerajat,ToString, serta kesetaraan berbasis isi; tidak ada alokasi object di heap.Suhu salinan = pagi;: runtime menyalin isi struct, sehinggasalinanberdiri sendiri seperti struct biasa.pagi.Derajat = 28;: property hasil parameter posisional pada record struct berpasanganget; set;, sehingga nilainya boleh ditimpa;salinantetap24.5karena keduanya tidak berbagi data.pagi == new Suhu(28): operator==yang dibangkitkan membandingkan isi; hasilnyaTruetanpa 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:
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 #
| Aspek | Record Class | Record Struct |
|---|---|---|
| Keluarga tipe | Reference type (heap) | Value type (stack) |
| Property posisional | init-only | get; set; |
| Hasil assignment | Menyalin alamat object | Menyalin seluruh isi |
Kesetaraan == | Berbasis isi | Berbasis isi |
| Cocok untuk | Data pembawa nilai berukuran berapa pun | Data pembawa nilai yang kecil |