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:

csharp
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:

text
(3, 4)
(100, 4)
(0, 0)

Mari kita bedah baris demi baris:

  1. public struct TitikKoordinat: kata kunci struct menyatakan tipe value baru; data struct tersimpan di dalam variable yang memuatnya, tanpa alokasi object di heap.
  2. public TitikKoordinat(int x, int y): constructor berparameter wajib mengisi setiap field; compiler menolak program yang menyisakan field tanpa nilai.
  3. TitikKoordinat titikB = titikA;: runtime menyalin seluruh isi titikA ke titikB; kedua variable membawa data masing-masing, bukan berbagi alamat.
  4. titikB.X = 100;: perubahan hanya menyentuh salinan titikB, sehingga titikA tetap menampilkan (3, 4).
  5. TitikKoordinat titikC = default;: struct tanpa new tetap sah; nilai default mengisi seluruh field numerik dengan 0.

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:

AspekStructClass
Keluarga tipeValue typeReference type
Hasil assignmentSalinan data berdiri sendiriDua variable menunjuk object yang sama
Cocok untukData kecil yang berperan sebagai satu nilaiObject 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.