Penyimpanan rak sering direpresentasikan sebagai pasangan koordinat: kolom dan baris untuk rak, bujur dan lintang untuk peta. Pasangan nilai semacam ini cocok dinyatakan sebagai struct karena struct adalah value type yang data utamanya tinggal di lokasi penyimpanan variabel, bukan di heap. Generic struct memperluas pola itu: satu definisi pasangan melayani int untuk koordinat rak, double untuk koordinat peta, dan tipe lain sesuai kebutuhan.

Mendefinisikan Generic Struct #

Aturan deklarasinya sama seperti generic class; kata kunci struct hanya mengubah semantik penyimpanan menjadi value type:

csharp
public struct Titik<T>
{
    public T X;
    public T Y;

    public Titik(T x, T y)
    {
        X = x;
        Y = y;
    }

    public override string ToString()
    {
        return $"({X}, {Y})";
    }
}

Titik<int> posisiRak = new Titik<int>(3, 7);
Titik<double> posisiPeta = new Titik<double>(-2.5, 10.75);
Console.WriteLine(posisiRak);
Console.WriteLine(posisiPeta);
Console.WriteLine(posisiRak.X);

Output yang Dihasilkan:

text
(3, 7)
(-2.5, 10.75)
3

Mari kita bedah baris demi baris:

  1. public struct Titik<T>: Struct menerima type parameter T untuk tipe kedua koordinat; satu definisi melayani semua tipe nilai.
  2. public T X; public T Y;: Kedua field menyimpan koordinat bertipe T; nilai X dan Y ikut tersalin bersama struct, bukan berupa reference terpisah.
  3. public Titik(T x, T y): Constructor mengisi seluruh field agar struct langsung siap dipakai.
  4. public override string ToString(): Struct mewarisi object.ToString(), dan override di sini membuat output terbaca.
  5. new Titik<int>(3, 7) dan new Titik<double>(-2.5, 10.75): Dua constructed type berbeda lahir dari definisi yang sama; posisiRak.X mengembalikan int tanpa cast.

Kapan Memilih Struct daripada Class #

  • Data berukuran kecil dan berperilaku seperti satu nilai, misalnya pasangan koordinat atau pasangan kunci-nilai.
  • Banyak instance hidup sesaat; struct menghindari tekanan garbage collection dari alokasi heap per objek.
  • Penyalinan nilai tidak menjadi masalah, karena assignment struct menyalin seluruh isinya.

Perilaku penyalinan itu layak diingat ketika struct generik dipindahkan antar variable: penugasan Titik<int> menyalin pasangan nilai secara utuh, sehingga perubahan pada salinan tidak menyentuh asalnya. Pola ini berbeda dari generic class, yang menyalin reference dan berbagi satu isi yang sama. Karena setiap instantiasi struct membawa ukuran dua field T, pasangan dengan tipe besar sebaiknya tidak dijadikan struct demi menjaga biaya penyalinan tetap kecil.

Dengan Titik<T>, representasi pasangan nilai tetap satu definisi, sementara setiap instantiasi tetap bertipe kuat dan hemat alokasi.