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:
(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:
Budi
90
True
Budi: 90
7 3
System.ValueTuple`2[System.String,System.Int32]Mari kita bedah baris demi baris:
(string Nama, int Nilai) mahasiswa = ("Budi", 90);: tipe tuple ditulis langsung sebagai pasangan tipe dalam kurung; nama elemenNamadanNilaimembuat akses terbaca seperti property.(string X, int Y) salinanBedaNama = mahasiswa;: penugasan tetap sah meskipun nama elemennya berbeda, karena nama hanya berlaku saat kompilasi dan tidak tersimpan di runtime.mahasiswa == salinanBedaNama: operator==membandingkan isi elemen satu per satu; hasilnyaTruekarenaBudidan90sama.(string nama, int nilai) = mahasiswa;: deconstruction memecah tuple menjadi dua variable sekaligus dalam satu baris.(kiri, kanan) = (kanan, kiri);: tuple sisi kanan dibentuk dulu, baru dipisahkan ke variable sisi kiri; dua nilai tertukar tanpa variable bantu.mahasiswa.GetType(): hasilnyaSystem.ValueTuple`2yang menegaskan tuple adalah structValueTuple, 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:
| Kebutuhan | Pilihan |
|---|---|
| Mengelompokkan beberapa nilai sekali pakai di dalam satu method | Tuple |
| Data yang dipakai lintas method dan perlu didokumentasikan | Struct, record, atau class |
| Pasangan nilai kembalian dari method internal | Tuple dengan nama elemen |