Kadang kita perlu mengelompokkan dua atau tiga nilai sekali pakai, misalnya nama beserta nilainya, tanpa mau menulis class atau struct baru. Tuple type menjawab kebutuhan itu: struktur ringan yang dideklarasikan langsung di tempat pemakaiannya, lengkap dengan nama elemen agar tiap nilai mudah diakses. Section Fungsi dan Method telah menunjukkan tuple sebagai nilai kembalian; bab ini membahas tuple sebagai tipe data, termasuk aturan namanya dan deconstruction.

Tuple dengan Nama Elemen #

Contoh berikut membuat tuple bernama, menyalinnya, membongkarnya, lalu menukar dua angka:

csharp
(string Nama, int Nilai) mahasiswa = ("Budi", 90);
(string X, int Y) salinanBedaNama = mahasiswa;

Console.WriteLine(mahasiswa.Nama);
Console.WriteLine(mahasiswa.Nilai);
Console.WriteLine(mahasiswa == salinanBedaNama);

(string nama, int nilai) = mahasiswa;
Console.WriteLine($"{nama}: {nilai}");

int kiri = 3;
int kanan = 7;
(kiri, kanan) = (kanan, kiri);
Console.WriteLine($"{kiri} {kanan}");

Console.WriteLine(mahasiswa.GetType());

Output yang Dihasilkan:

text
Budi
90
True
Budi: 90
7 3
System.ValueTuple`2[System.String,System.Int32]

Mari kita bedah baris demi baris:

  1. (string Nama, int Nilai) mahasiswa = ("Budi", 90);: tipe tuple ditulis langsung sebagai pasangan tipe dalam kurung; nama elemen Nama dan Nilai membuat akses terbaca seperti property.
  2. (string X, int Y) salinanBedaNama = mahasiswa;: penugasan tetap sah meskipun nama elemennya berbeda, karena nama hanya berlaku saat kompilasi dan tidak tersimpan di runtime.
  3. mahasiswa == salinanBedaNama: operator == membandingkan isi elemen satu per satu; hasilnya True karena Budi dan 90 sama.
  4. (string nama, int nilai) = mahasiswa;: deconstruction memecah tuple menjadi dua variable sekaligus dalam satu baris.
  5. (kiri, kanan) = (kanan, kiri);: tuple sisi kanan dibentuk dulu, baru dipisahkan ke variable sisi kiri; dua nilai tertukar tanpa variable bantu.
  6. mahasiswa.GetType(): hasilnya System.ValueTuple`2 yang menegaskan tuple adalah struct ValueTuple, sehingga data tersimpan sebagai value type.

Tuple atau Tipe Bernama #

Tuple dan anonymous type punya perbedaan penting pada sifat isinya. Elemen tuple dapat ditimpa setelah dibuat, misalnya mahasiswa.Nilai = 95;, sedangkan seluruh property anonymous type bersifat read-only. Deconstruction juga menerima pola buang _ untuk elemen yang tidak kita perlukan, sehingga (string nama, _) = mahasiswa; hanya membentuk variable nama. Ketika kebutuhan bergerak ke arah data yang dipakai lintas method, tabel berikut membantu menentukan pilihan:

KebutuhanPilihan
Mengelompokkan beberapa nilai sekali pakai di dalam satu methodTuple
Data yang dipakai lintas method dan perlu didokumentasikanStruct, record, atau class
Pasangan nilai kembalian dari method internalTuple dengan nama elemen