Pernyataan if menjalankan sebuah blok kode hanya saat sebuah kondisi bernilai true. else if menambahkan pemeriksaan lain, dan else menangkap semua yang tidak cocok dengan pemeriksaan-pemeriksaan itu.
Output:
Order 120: shipping 0
Order 75.50: shipping 4.99
Order 20: shipping 9.99
Kondisinya diperiksa dari atas ke bawah dan kondisi true yang pertama menang. Pesanan senilai 120 cocok dengan >= 100 dan tidak pernah sampai ke pemeriksaan >= 50, itulah sebabnya kondisi yang paling spesifik ditaruh di urutan pertama. else if bukan kata kunci tersendiri: ia adalah else yang badannya berupa if lain, jadi tidak ada elseif atau elif di C#.
Kondisi harus bertipe bool
C# tidak pernah menganggap angka, string atau objek sebagai true atau false. Ekspresi di dalam tanda kurung harus bertipe bool:
int count = 3;
if (count) // error CS0029: Cannot implicitly convert type 'int' to 'bool'
if (count > 0) // correct
if (name) // error: a string is not a bool either
if (name != null) // correct
Aturan ini menghilangkan sekumpulan bug yang ada di C dan JavaScript, di mana 0, "" dan null diam-diam dianggap false. Harganya, kamu harus menulis perbandingannya setiap kali, dan itu juga membuat maksudmu terlihat jelas bagi pembaca berikutnya.
Menggabungkan kondisi dengan &&, || dan !
&& (dan), || (atau) dan ! (tidak) menggabungkan pemeriksaan boolean. && dan || melakukan short-circuit: sisi kanan hanya dijalankan kalau sisi kiri belum menentukan jawabannya.
Output:
maya: welcome
invalid or banned account
invalid or banned account
omar: age 9 rejected
invalid or banned account
Pemanggilan dengan null aman berkat short-circuit: begitu username != null bernilai false, username.Length tidak pernah dievaluasi, jadi tidak ada NullReferenceException. Tukar urutannya menjadi username.Length >= 3 && username != null dan pemanggilan yang sama akan crash.
&& mengikat lebih kuat daripada ||, jadi a || b && c berarti a || (b && c). Tambahkan tanda kurung setiap kali kamu mencampur keduanya; compiler tidak membutuhkannya, tapi pembaca membutuhkannya. & dan | yang satu karakter juga bekerja pada bool, tapi selalu mengevaluasi kedua sisinya. Pakai hanya saat sisi kanannya punya efek samping yang harus terjadi.
Kurung kurawal dan aturan satu pernyataan
Kurung kurawal boleh tidak ditulis saat sebuah cabang hanya berisi satu pernyataan. Tanpa kurung kurawal, hanya pernyataan berikutnya yang menjadi bagian dari if, apa pun kata indentasinya:
Output:
Reorder email sent
Stock: 12
"Reorder email sent" tetap dicetak walaupun stoknya aman: WriteLine yang kedua berada di luar if, meskipun indentasinya terlihat sebaliknya. Guard satu baris seperti if (x == null) return; tidak masalah tanpa kurung kurawal; apa pun yang mungkin bertambah menjadi dua baris sebaiknya diberi kurung kurawal.
Bug yang mirip adalah titik koma tepat setelah kondisi. if (stock < 5); mengakhiri if dengan pernyataan kosong, dan blok setelahnya selalu dijalankan tanpa syarat. Compiler menandainya dengan warning CS0642, Possible mistaken empty statement, yang layak diperlakukan seperti error.
= vs == dalam kondisi
= memberikan nilai, == membandingkan. Untuk sebagian besar tipe, salah menulis = tidak akan bisa di-compile, karena hasil pemberian nilai adalah nilai yang diberikan dan int bukan bool:
int score = 10;
if (score = 100) { } // error CS0029: Cannot implicitly convert type 'int' to 'bool'
Dengan variabel bool, pemberian nilai itu sendiri bertipe bool, jadi salah ketik ini tetap bisa di-compile:
Output:
Access granted
isAdmin is now True
Kondisi itu menimpa isAdmin lalu memeriksa nilai barunya. Compiler memberi warning (CS0665, pemberian nilai dalam ekspresi kondisional selalu konstan), tapi build-nya tetap berhasil. Untuk bool, tidak perlu menulis perbandingan sama sekali: if (isAdmin) dan if (!isAdmin) lebih enak dibaca dan tidak mungkin salah ketik dengan cara ini.
if bersarang vs guard clause
Setiap tingkat percabangan bersarang adalah satu kondisi lagi yang harus diingat pembaca. Saat setiap pemeriksaan menolak input yang buruk, kembalikan hasil lebih awal daripada menaruh alur normal di dalam semua pemeriksaan itu:
Output:
ordered 2 x keyboard
error: no product
error: quantity must be positive
error: insufficient balance
Versi bersarang dari method yang sama akan punya tiga tingkat if dengan pekerjaan sebenarnya di blok paling dalam dan tiga cabang else yang menutupnya di bagian bawah. Dengan guard clause, setiap aturan berada di sebelah pesan error-nya dan baris terakhir adalah kasus normalnya. Ide yang sama bisa dipakai di dalam loop dengan continue.
Mendeklarasikan variabel di dalam kondisi
Sebuah kondisi bisa mendeklarasikan variabel yang berlaku di dalam if. Dua bentuk yang umum adalah out var dari method TryParse dan pola tipe is:
Output:
42: positive number 42
abc: not a number
-7: number -7, not positive
string of length 5
TryParse mengembalikan false dan tidak melempar exception saat input-nya buruk, sehingga sangat cocok dipakai di dalam if. Halaman konversi tipe membahas method-method parsing secara detail.
Kapan memakai yang lain
- Memilih salah satu dari dua nilai: operator kondisional
condition ? a : blebih singkat daripadaifyang memberikan nilai di kedua cabangnya. - Banyak cabang untuk satu nilai: pernyataan
switchmembandingkan sebuah nilai dengan case berupa konstanta dan lebih mudah dibaca sekilas daripada sepuluh bariselse if. - Memetakan sebuah nilai ke sebuah hasil: pencarian di
Dictionarymenggantikan rantai yang panjang saat cabang-cabangnya hanya berbeda pada datanya.
Pertanyaan yang sering diajukan
Bagaimana cara menulis else if di C#?
Tulis else if sebagai dua kata: if (a) { ... } else if (b) { ... } else { ... }. Kondisinya diperiksa dari atas ke bawah dan hanya cabang pertama yang bernilai true yang dijalankan, jadi taruh pemeriksaan yang paling spesifik di urutan pertama. Tidak ada kata kunci elif atau elseif.
Kenapa saya tidak bisa menulis if (count) di C#?
Kondisi di C# harus bertipe bool. Tidak seperti C dan JavaScript, sebuah int, string atau objek tidak pernah dikonversi menjadi true atau false, jadi if (count) gagal dengan CS0029, Cannot implicitly convert type 'int' to 'bool'. Tulis pemeriksaan yang kamu maksud: if (count > 0) atau if (name != null).
Apa perbedaan && dan & dalam kondisi if?
&& melakukan short-circuit: kalau sisi kirinya false, sisi kanannya tidak pernah dievaluasi, dan inilah yang membuat s != null && s.Length > 0 aman. & pada dua bool selalu mengevaluasi kedua sisinya. Hal yang sama berlaku untuk || dan |. Pakai && dan || dalam kondisi, kecuali kamu butuh efek samping dari sisi kanannya.
Apakah kurung kurawal wajib di pernyataan if C#?
Tidak. Tanpa kurung kurawal, if hanya mengendalikan tepat satu pernyataan. Memberi indentasi pada baris kedua tidak menambahkannya ke cabang itu, dan ini sumber bug yang klasik, jadi sebagian besar panduan gaya menyarankan kurung kurawal di setiap cabang.
Apakah bisa menulis if else dalam satu baris di C#?
Untuk memilih sebuah nilai, pakai operator kondisional: string label = score >= 50 ? "pass" : "fail";. Untuk menjalankan pernyataan, if (x) DoA(); else DoB(); boleh ditulis dalam satu baris, tapi lebih sulit dibaca dan dikembangkan dibanding blok dengan kurung kurawal.