Class menghasilkan tipe referensi: variable bertipe class menyimpan alamat object di heap. Kebutuhan lain muncul ketika data yang kita wakili berukuran kecil dan berperan layaknya satu nilai, misalnya koordinat titik pada peta atau warna RGB. Untuk kasus semacam itu, C# menyediakan struct: tipe value yang kita definisikan sendiri, sehingga variable yang mendeklarasikannya menyimpan data secara langsung, sama seperti int atau double.
Mendefinisikan Struct #
Struct dideklarasikan dengan kata kunci struct. Anggotanya boleh berupa field, property, constructor, dan method, seperti pada class. Contoh berikut mendefinisikan struct TitikKoordinat, lalu menguji perilaku penyalinannya:
public struct TitikKoordinat
{
public int X;
public int Y;
public TitikKoordinat(int x, int y)
{
X = x;
Y = y;
}
public override string ToString() => $"({X}, {Y})";
}
TitikKoordinat titikA = new TitikKoordinat(3, 4);
TitikKoordinat titikB = titikA;
titikB.X = 100;
TitikKoordinat titikC = default;
Console.WriteLine(titikA);
Console.WriteLine(titikB);
Console.WriteLine(titikC);Output yang Dihasilkan:
(3, 4)
(100, 4)
(0, 0)Mari kita bedah baris demi baris:
public struct TitikKoordinat: kata kuncistructmenyatakan tipe value baru; data struct tersimpan di dalam variable yang memuatnya, tanpa alokasi object di heap.public TitikKoordinat(int x, int y): constructor berparameter wajib mengisi setiap field; compiler menolak program yang menyisakan field tanpa nilai.TitikKoordinat titikB = titikA;: runtime menyalin seluruh isititikAketitikB; kedua variable membawa data masing-masing, bukan berbagi alamat.titikB.X = 100;: perubahan hanya menyentuh salinantitikB, sehinggatitikAtetap menampilkan(3, 4).TitikKoordinat titikC = default;: struct tanpanewtetap sah; nilaidefaultmengisi seluruh field numerik dengan0.
Ciri Khas Struct #
Runtime menyimpan struct di tempat variable itu berada: di stack ketika variable bersifat lokal, atau di dalam object pembungkusnya ketika struct menjadi field class. Tidak ada object terpisah yang dibuat untuk struct, sehingga pembuatan struct tidak memberi beban pada garbage collection. Tiga ciri berikut membedakan struct dari class:
| Aspek | Struct | Class |
|---|---|---|
| Keluarga tipe | Value type | Reference type |
| Hasil assignment | Salinan data berdiri sendiri | Dua variable menunjuk object yang sama |
| Cocok untuk | Data kecil yang berperan sebagai satu nilai | Object dengan identitas dan perilaku kompleks |
Struct paling cocok untuk data kecil berisi beberapa field yang sering dibuat dan dibuang, misalnya hasil perhitungan sementara. Struct juga boleh mengimplementasikan interface dan meng-override method warisan seperti ToString pada contoh di atas. Panduan lengkap memilih antara struct dan class dibahas pada bab penutup section ini.