Topik ini membahas masukan dan keluaran konsol (input/output console) dengan kelas Console, yaitu cara program menampilkan teks ke terminal dan menerima teks dari penggunanya. Pemakaian Write dan WriteLine dibahas lebih dahulu, disusul pola pembacaan masukan dan penguraian teks menjadi angka dengan aman. Setelah topik ini diselesaikan, program konsol kecil dapat menerima masukan tanpa berhenti karena nilai yang tidak terduga.
Menulis ke konsol#
Kelas Console menyediakan dua metode tulis yang berselingan. Metode Console.Write mencetak teksnya tanpa memindahkan posisi ke baris berikutnya, sedangkan Console.WriteLine mencetak teksnya lalu berpindah baris. Penggabungan keduanya menyusun satu baris dari beberapa bagian.
Console.Write("Halo, ");
Console.Write("Citra");
Console.WriteLine("!");
Console.WriteLine("Baris ini ditutup dengan pindah baris.");Halo, Citra!
Baris ini ditutup dengan pindah baris.Tiga pemanggilan pertama menyusun satu baris yang sama karena hanya WriteLine yang menutup barisnya. Perilaku ini juga menjelaskan kenapa Console.WriteLine() tanpa argumen menghasilkan baris kosong, yaitu hanya pindah baris tanpa teks.
Membaca masukan#
Metode Console.ReadLine membaca satu baris dari terminal dan mengembalikan teksnya tanpa tanda pindah baris. Metode ini menunggu sampai pengguna menekan Enter, sehingga contohnya tidak dapat dijalankan di lingkungan yang tidak menyediakan masukan seperti sandbox jalur ini.
// tidak-dijalankan
Console.Write("Masukkan nama: ");
string? masukan = Console.ReadLine();
Console.WriteLine($"Halo, {masukan}!");Tipe kembaliannya string? karena aliran masukan bisa saja berakhir tanpa teks, sehingga model keamanan null berlaku sepenuhnya pada hasilnya. Cara lain yang dapat dijalankan di lingkungan mana pun adalah membaca argumen baris perintah, yaitu teks yang dituliskan setelah nama program saat dipanggil. Pada program top-level statement, teks tersebut tersedia melalui variabel args.
if (args.Length == 0)
{
Console.WriteLine("Nama belum diberikan.");
return;
}
string nama = args[0];
Console.WriteLine($"Halo, {nama}!");Simpan program di atas sebagai sapa.cs, kemudian jalankan dengan perintah dotnet run --file sapa.cs -- Dewi. Tanda -- memisahkan opsi milik perintah dotnet dari argumen milik program, sehingga Dewi diterima sebagai argumen pertama.
Halo, Dewi!Program yang sama tanpa argumen mencetak Nama belum diberikan. karena kondisi args.Length == 0 terpenuhi. Pemeriksaan tersebut wajib dilakukan sebelum mengakses args[0], karena indeks di luar isi array memunculkan exception saat program berjalan.
Variabel args bertipe string[], yaitu array yang setiap elemennya satu teks argumen. Urutan elemennya mengikuti urutan penulisan di terminal, dengan indeks dimulai dari nol. Program boleh menerima lebih dari satu argumen sekaligus, misalnya sebuah nama lalu sebuah angka, dan setiap argumen tetap berupa teks yang perlu diuraikan sebelum dipakai dalam penghitungan.
Parsing masukan dengan aman#
Masukan dari konsol selalu berupa string, sehingga angka yang diketik pengguna perlu diuraikan (parse) menjadi tipe angka sebelum dihitung. Metode int.TryParse mengubah teks menjadi int dengan dua keluaran sekaligus, yaitu nilai bool yang melaporkan keberhasilan dan angka hasil penguraian melalui parameter out.
string masukanPertama = "42";
string masukanKedua = "empat";
bool berhasilPertama = int.TryParse(masukanPertama, out int nilaiPertama);
bool berhasilKedua = int.TryParse(masukanKedua, out int nilaiKedua);
Console.WriteLine(berhasilPertama);
Console.WriteLine(nilaiPertama);
Console.WriteLine(berhasilKedua);
Console.WriteLine(nilaiKedua);True
42
False
0Teks 42 berhasil diuraikan menjadi angka, sedangkan teks empat gagal dan menghasilkan false dengan angka 0 sebagai nilai default. Tidak ada exception yang muncul pada kasus gagal, sehingga alur program tetap dalam kendali kode yang menulisnya. Variabel yang dideklarasikan pada parameter out boleh ditulis langsung di pemanggilannya, sebagaimana out int nilaiPertama, dan lingkupnya berlanjut ke sisa blok kode. Metode TryParse juga tersedia untuk tipe lain, misalnya double.TryParse untuk bilangan pecahan, sehingga satu kedisiplinan yang sama berlaku pada semua masukan. Metode int.Parse melakukan pekerjaan yang sama tetapi memunculkan FormatException saat teksnya tidak sah, sehingga hanya cocok untuk teks yang kebenarannya sudah dijamin.
Pemanggilan Console.ReadLine sebenarnya mengembalikan string?, yaitu string yang boleh bernilai null karena aliran masukan bisa berakhir tanpa baris apa pun. Keadaan ini jarang terlihat pada konsol interaktif yang selalu menunggu ketikan, tetapi muncul ketika masukan program dialihkan dari berkas yang sudah habis dibaca atau ketika aliran masukan ditutup oleh sistem. Program yang teliti menguji hasil pembacaan sebelum dipakai, sehingga alurnya berhenti dengan rapi alih-alih memicu NullReferenceException di tengah penghitungan. Kebiasaan ini juga melatih kontrak yang sama yang dipakai pembacaan berkas pada modul berkas dan data, sehingga pola pemeriksaannya dapat dipindahkan begitu saja.
Kesalahan umum#
- Memanggil
int.Parseatas masukan pengguna tanpa perlindungan. Teks yang tidak berupa angka memunculkanFormatExceptiondan menghentikan program. Ganti denganint.TryParseagar kegagalan ditangani sebagai nilaiboolbiasa. - Menganggap hasil
Console.ReadLinepasti berisi teks. Tipe kembaliannyastring?, sehingga pemakaiannya tanpa pemeriksaan memunculkan warning CS8602 dan berpotensiNullReferenceException. Gunakan pemeriksaanis nullatau nilai cadangan??. - Mengakses
args[0]tanpa memeriksa isinya. Array kosong tidak memiliki elemen pertama, sehingga aksesnya memunculkanIndexOutOfRangeException. Periksaargs.Lengthterlebih dahulu. - Mencampur aduk masukan angka yang sudah diuraikan dengan teks aslinya. Simpan hasil
TryParsepada variabelintyang berbeda dari string masukannya, agar tipe setiap variabel jelas maksudnya.
Ringkasan#
Console.Writemencetak tanpa pindah baris, sedangkanConsole.WriteLinemenutup barisnya.Console.ReadLinemengembalikanstring?dan menunggu Enter, sehingga polanya perlu disertai pemeriksaan null.- Argumen baris perintah tersedia melalui variabel
argspada program top-level statement, dan panjangnya perlu diperiksa sebelum diakses. int.TryParsemenguraikan teks menjadi angka tanpa exception, dengan nilaiboolsebagai laporan keberhasilan dan parameteroutsebagai hasilnya.
Referensi#
- Console Class — Microsoft Learn
— Dokumentasi kelas
Console, termasuk metodeWrite,WriteLine, danReadLine. - Int32.TryParse Method — Microsoft Learn
— Menjelaskan pola penguraian aman dengan parameter
outdan nilai kembalianbool.