Variabel dan Pengetikan Kuat

Tipe int, double, string, bool, aturan pengetikan kuat, dan type inference.

Daftar isi

Topik ini membahas variabel (variable) dan pengetikan kuat di C#, yaitu cara menyimpan nilai pada nama tertentu beserta aturan yang menjaga tipe datanya tetap konsisten. Empat tipe dasar yang dibahas adalah int, double, string, dan bool, disusul aturan konversi antar tipe dan penetapan tipe otomatis oleh kompilator. Setelah topik ini diselesaikan, deklarasi variabel dapat ditulis dengan tipe yang tepat dan pesan error terkait tipe dapat dibaca dengan percaya diri.

Tipe data dasar#

Variabel adalah nama yang merujuk pada lokasi penyimpanan sebuah nilai dengan tipe tertentu. C# menyediakan banyak tipe bawaan, tetapi empat tipe berikut mencakup kebutuhan umum program konsol pada tahap awal. Tabel berikut merangkum keyword-nya, jenis nilai yang disimpan, dan contoh penulisannya.

TipeJenis nilaiContoh penulisanNama tipe .NET
intbilangan bulat328System.Int32
doublebilangan pecahan27.5System.Double
stringteks"Bandung"System.String
boolnilai kebenaranfalseSystem.Boolean

Deklarasi variabel memakai pola tipe nama = nilai;. Nilai awalnya wajib diberikan sebelum variabel dibaca, dan penamaannya mengikuti konvensi camel case, yaitu huruf kecil pada kata pertama dan huruf besar pada awal kata berikutnya. Program berikut mendeklarasikan satu variabel untuk setiap tipe, lalu mencetak semuanya.

csharp Contoh: deklarasi empat tipe dasar
int jumlahHalaman = 328;
double hargaTiket = 27.5;
string namaKota = "Bandung";
bool sudahSelesai = false;

Console.WriteLine(jumlahHalaman);
Console.WriteLine(hargaTiket);
Console.WriteLine(namaKota);
Console.WriteLine(sudahSelesai);
text Keluaran
328
27.5
Bandung
False

Nilai bool dicetak sebagai False dengan huruf awal kapital, meskipun dalam kode ditulis false. Perhatikan pula bahwa pemisah desimal pada double adalah titik, mengikuti konvensi penulisan C#. Tipe .NET pada kolom terakhir adalah nama resmi tipe tersebut di dalam library standar, dan keduanya dapat dipakai bergantian, tetapi keyword seperti int yang lazim dipakai dalam kode sehari-hari.

Tipe int menyimpan bilangan bulat pada rentang sekitar minus 2,1 miliar sampai 2,1 miliar, dan kebutuhan yang melampaui rentang itu ditampung oleh tipe long. Tipe double menyimpan pecahan dengan presisi ganda, tetapi hasilnya tetap merupakan pendekatan biner dari angka yang ditulis. Aturan penamaannya mengikuti identifier bawaan bahasa, yaitu boleh memuat huruf, angka, dan garis bawah, dengan syarat tidak diawali angka dan tidak bertabrakan dengan keyword bahasa.

Aturan pengetikan kuat#

C# menerapkan strong typing (pengetikan kuat), yaitu tipe setiap variabel ditetapkan saat kompilasi dan tidak dapat berubah selama program berjalan. Kompilator memeriksa setiap penugasan nilai, sehingga nilai yang tipenya tidak cocok ditolak sebelum program sempat dijalankan. Program berikut gagal dikompilasi karena sebuah string tidak dapat dimasukkan ke dalam variabel int.

csharp Contoh: penugasan dengan tipe yang tidak cocok
// tidak-dijalankan
int usia = "dua puluh";

Kompilator menolak baris tersebut dengan pesan error CS0029: Cannot implicitly convert type 'string' to 'int'. Pengetikan kuat membuat kelas error ini tersangkut di waktu kompilasi, jauh sebelum program dijalankan oleh pengguna. Perilaku ini berbeda dengan bahasa yang tipe datanya berubah-ubah secara diam-diam, yang kelirunya baru muncul saat program berjalan.

Konversi antar tipe tetap dimungkinkan dengan aturan yang jelas. Konversi dari int ke double bersifat implisit karena tidak ada datanya yang hilang, sedangkan arah sebaliknya memerlukan cast, yaitu konversi eksplisit yang ditulis dengan nama tipe di dalam tanda kurung. Cast dari double ke int memotong bagian desimalnya tanpa membulatkan.

csharp Contoh: konversi implisit dan cast eksplisit
int angkaBulat = 42;
double angkaPecahan = angkaBulat; // konversi implisit dari int ke double

Console.WriteLine(angkaPecahan);

double nilai = 9.7;
int dibulatkan = (int)nilai;      // cast eksplisit, bagian desimal dipotong

Console.WriteLine(dibulatkan);
text Keluaran
42
9

Keluaran menunjukkan 9.7 menjadi 9, bukan 10, karena cast hanya memotong. Apabila pembulatan biasa diinginkan, metode Math.Round yang tersedia di library standar dapat digunakan.

Penetapan tipe otomatis#

Keyword var memerintahkan kompilator menetapkan tipe variabel secara otomatis dari nilai awalnya, kemampuan yang disebut type inference (penetapan tipe otomatis). Variabel yang dideklarasikan dengan var tetap bertipe kuat, karena tipe yang disimpulkan itu mengunci variabel tersebut seperti deklarasi biasa. Perbedaannya hanya pada penulisan, bukan pada perilakunya.

csharp Contoh: var tetap menghasilkan tipe yang kuat
var jumlahSiswa = 30;
var rataRata = 87.25;
var namaSekolah = "SMA Negeri 1";

Console.WriteLine(jumlahSiswa.GetType());
Console.WriteLine(rataRata.GetType());
Console.WriteLine(namaSekolah.GetType());
text Keluaran
System.Int32
System.Double
System.String

Metode GetType() melaporkan tipe sesungguhnya dari setiap variabel saat program berjalan. Keluarannya membuktikan bahwa var bukan tipe data sakti, melainkan singkatan penulisan. Ada dua batasan yang perlu diperhatikan saat memakainya.

csharp Contoh: batasan pemakaian var
// tidak-dijalankan
var kosong;
var nilai = 10;
nilai = "sepuluh";

Deklarasi var kosong; ditolak dengan error CS0818 karena var memerlukan nilai awal untuk menyimpulkan tipenya. Penugasan "sepuluh" ke variabel int juga ditolak dengan error CS0029, membuktikan bahwa tipe variabel tersebut terkunci setelah deklarasi. Selain itu, var hanya boleh dipakai untuk variabel lokal, bukan untuk parameter metode maupun field kelas.

Kesalahan umum#

  • Membaca variabel sebelum diberi nilai. Variabel lokal yang belum diinisialisasi ditolak dengan error CS0165: Use of unassigned local variable. Beri nilai awal pada saat deklarasi agar peringatan ini tidak muncul.
  • Menugaskan double ke int tanpa cast. Konversi yang menurunkan presisi tidak dilakukan secara diam-diam, sehingga muncul error CS0266 yang menyarankan cast eksplisit. Tambahkan (int) hanya bila pemotongan desimal memang diinginkan.
  • Mengandalkan double untuk nilai uang. Tipe double menyimpan pecahan secara pendekatan, sehingga penjumlahan uang dapat menghasilkan angka seperti 0.30000000000000004. Untuk kebutuhan presisi finansial, tipe decimal lebih cocok.
  • Anggapan bahwa var bertipe bebas. Tipe hasil inferensi terkunci sejak deklarasi, sehingga penugasan dengan tipe lain selalu ditolak. Perlakukan var persis seperti deklarasi biasa.

Ringkasan#

  • Empat tipe dasar int, double, string, dan bool mencakup bilangan bulat, bilangan pecahan, teks, dan nilai kebenaran.
  • Pengetikan kuat menetapkan tipe variabel pada waktu kompilasi, sehingga penugasan dengan tipe yang tidak cocok ditolak dengan pesan error sebelum program dijalankan.
  • Konversi melebar dari int ke double bersifat implisit, sedangkan arah sebaliknya memerlukan cast yang memotong bagian desimal.
  • var menyembunyikan penulisan tipe melalui inferensi dari nilai awalnya, tetapi variabelnya tetap bertipe kuat dan terkunci.

Referensi#