Topik ini membahas dua bentuk penulisan deklarasi yang mengurangi pengulangan nama tipe, yaitu var untuk type inference dan new() bertipe target (target-typed new) yang menyimpulkan tipe dari sisi kiri penugasannya. Keduanya dipertimbangkan bersama aturan tentang kapan tipe eksplisit tetap lebih unggul. Setelah topik ini diselesaikan, gaya deklarasi variabel dapat dipilih sesuai keterbacaan kode, bukan sekadar kebiasaan.
var dan aturannya#
Keyword var memerintahkan kompilator menyimpulkan tipe variabel dari nilai awalnya. Tipe hasil inferensi terkunci sejak deklarasi, sehingga variabel var identik perilakunya dengan deklarasi bertipe eksplisit. Metode GetType() berikut membuktikan bahwa tipe yang tersimpan adalah tipe sungguhan, bukan tipe yang berubah-ubah.
var jumlahBuku = 12;
var judulBuku = "Pengantar Aljabar";
Console.WriteLine(jumlahBuku.GetType());
Console.WriteLine(judulBuku.GetType());System.Int32
System.StringAturan var cukup pendek untuk dihafal. Nilai awalnya wajib ada karena menjadi sumber inferensi, tipenya tidak dapat diubah setelah deklarasi, dan var hanya boleh dipakai pada variabel lokal, bukan pada field kelas maupun parameter metode. Dengan aturan itu, var adalah singkatan penulisan dan bukan tipe data yang longgar.
new bertipe target#
Operator new membuat instance baru dari sebuah tipe. Sejak C# 9, operator ini boleh ditulis tanpa nama tipenya, yaitu new(), dan kompilator menyimpulkan tipenya dari sisi kiri penugasan. Bentuk ini disebut target-typed new karena sasaran tipenya ada pada variabel tujuannya.
int angka = new();
string titik = new('.', 8);
Console.WriteLine(angka);
Console.WriteLine(titik);0
........Ekspresi new() pada int menghasilkan nilai default 0, sedangkan new('.', 8) memanggil konstruktor string yang mengulang satu karakter sebanyak delapan kali. Kemanfaatannya paling terasa pada tipe dengan nama panjang. Tipe koleksi List<string> dari library standar menyimpan daftar string, dan penulisannya tidak perlu diulang di sisi kanan.
List<string> daftarTugas = new();
daftarTugas.Add("membaca buku");
Console.WriteLine(daftarTugas.Count);1Bentuk new() juga menghilangkan satu sumber ketidakcocokan, yaitu tipenya hanya ditulis pada satu tempat. Perubahan tipe variabel cukup dilakukan di sisi kiri, dan sisi kanannya mengikuti tanpa disunting. Pada deklarasi List<string> daftarTugas = new List<string>();, kedua sisi harus dijaga tetap sama secara manual, dan penyimpangan semacam itulah yang memicu error saat kompilasi.
Interaksi var dan new() perlu dicermati karena keduanya saling bertentangan. var menuntut informasi tipe dari sisi kanan, sedangkan new() menuntutnya dari sisi kiri, sehingga kombinasi keduanya tidak memiliki sumber informasi tipe sama sekali.
// tidak-dijalankan
var konfigurasi = new();Kompilator menolak baris tersebut dengan error CS8754: There is no target type for 'new()'. Perbaikannya sederhana, yaitu menulis tipenya secara eksplisit di salah satu sisi, misalnya string konfigurasi = new();, meskipun bentuk seperti ini jarang bermanfaat.
Kapan tipe eksplisit lebih unggul#
Singkatan deklarasi hanya bermanfaat bila tipenya masih terbaca. Literall angka pun menyimpan kejutan kecil karena 80 disimpulkan sebagai int, sedangkan 80.0 disimpulkan sebagai double. Perbedaan satu karakter ini mengubah tipe variabel dan perilaku penghitungan yang mengikutinya.
var nilaiPertama = 80; // int
var nilaiKedua = 80.0; // double
Console.WriteLine(nilaiPertama.GetType());
Console.WriteLine(nilaiKedua.GetType());System.Int32
System.DoubleTiga pedoman berikut menjaga keseimbangannya. Pertama, pakai var atau new() bila tipe terlihat jelas pada baris yang sama, misalnya saat nilai awalnya berupa litera yang langsung terbaca atau hasil new() yang sasarannya tertulis. Kedua, tulis tipe eksplisit bila tipe hasil ekspresi tidak mudah ditebak, karena pembaca kode tidak selalu mengingat tipe kembalian setiap metode. Ketiga, konsisten pada satu berkas atau satu tim, karena nilai gaya deklarasi justru hilang bila dipakai bergantian tanpa pertimbangan.
Di luar variabel lokal, pilihan gaya ini tidak tersedia sama sekali. Field kelas, parameter metode, dan tipe kembalian metode wajib menuliskan tipenya secara eksplisit, sehingga pertimbangan var atau tipe eksplisit hanya muncul di dalam tubuh metode. Dengan pembagian itu, deklarasi di tingkat kelas tetap rinci, sedangkan kode eksekusi di dalam metode boleh lebih ringkas.
Pertimbangan yang sama muncul ketika nilai yang disimpan berupa tipe antarmuka (interface). Sebuah List<string> dapat disimpan dalam variabel bertipe IList<string> atau IEnumerable<string>, dan var tidak menyediakan tempat untuk menyatakan pilihan itu karena selalu menangkap tipe konkrit dari sisi kanan. Deklarasi eksplisit pada kasus ini membawa informasi desain, yaitu kontrak sekecil apa yang dijanjikan variabelnya, dan pilihan itu memengaruhi kejelasan pesan error serta kemudahan penggantian implementasi di kemudian hari.
Kesalahan umum#
- Menggabungkan
vardengannew(). Kedua bentuk menuntut informasi tipe dari sisi yang berlawanan, sehingga munculerror CS8754. Tulis tipe eksplisit pada sisi kiri atau gunakan nilai awal yang bertipe jelas. - Mendeklarasikan
vartanpa nilai awal. Inferensi tidak memiliki bahan sama sekali, sehingga munculerror CS0818. Gunakan tipe eksplisit bila nilai baru tersedia di kemudian hari. - Menganggap
varseperti tipe dinamis. Tipe hasil inferensi terkunci sejak deklarasi, dan penugasan dengan tipe lain ditolak kompilator. Perilaku ini berbeda dengan tipe dinamis yang pemeriksaannya baru terjadi saat program berjalan.
Ringkasan#
varmenyimpulkan tipe dari nilai awalnya, dan tipe hasil inferensi itu terkunci seperti deklarasi eksplisit.new()bertipe target menyimpulkan tipe dari variabel tujuan, sehingga nama tipe panjang tidak perlu ditulis dua kali.- Kombinasi
vardannew()ditolak karena tidak ada sisi mana pun yang memberi informasi tipe. - Tipe eksplisit lebih unggul ketika tipe hasil ekspresi tidak terbaca langsung, sedangkan singkatan deklarasi menguntungkan ketika tipenya sudah jelas.
Referensi#
- Declaration statements — Microsoft Learn
— Aturan deklarasi variabel lokal, termasuk variabel dengan tipe tersirat
var. - new operator — Microsoft Learn
— Menjelaskan operator
new, termasuk bentuknew()bertipe target.