Menu

C# if else: else if Zincirleri, Koşullar ve Yaygın Hatalar

C#'ta if, else if ve else nasıl çalışır: koşulların neden bool olması gerektiği, testleri &&, || ve ! ile birleştirmek, süslü parantezlerin ne zaman önemli olduğu, derin iç içelik yerine koruma cümleleri ve = ile == ile başıboş noktalı virgül hataları.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Bir if ifadesi bir kod bloğunu yalnızca bir koşul doğru olduğunda çalıştırır. else if daha fazla test ekler, else ise testlerin yakalamadığı her şeyi yakalar.

Çıktı:

Order 120: shipping 0
Order 75.50: shipping 4.99
Order 20: shipping 9.99

Koşullar yukarıdan aşağıya kontrol edilir ve ilk doğru olan kazanır. 120'lik bir sipariş >= 100'e uyar ve >= 50 testine hiç ulaşmaz; en özel koşulun başa yazılmasının nedeni budur. else if ayrı bir anahtar kelime değildir: gövdesi başka bir if olan bir else'tir, bu yüzden C#'ta elseif ya da elif yoktur.

Koşullar bool Olmalıdır

C# bir sayıyı, bir string'i ya da bir nesneyi asla true ya da false olarak ele almaz. Parantez içindeki ifadenin tipi bool olmalıdır:

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

Bu, 0, "" ve null'ın sessizce false sayıldığı C ve JavaScript'teki bütün bir hata ailesini ortadan kaldırır. Bedeli, karşılaştırmayı her seferinde açıkça yazmanızdır; bu da niyeti sonraki okuyucuya görünür kılar.

Koşulları &&, || ve ! ile Birleştirmek

&& (ve), || (veya) ve ! (değil) boolean testleri birleştirir. && ve || kısa devre yapar: sağ taraf yalnızca sol taraf cevabı zaten belirlemediyse çalışır.

Çıktı:

maya: welcome
invalid or banned account
invalid or banned account
omar: age 9 rejected
invalid or banned account

null çağrısı kısa devre sayesinde güvenlidir: username != null false olduğu anda username.Length hiç değerlendirilmez, dolayısıyla NullReferenceException olmaz. Sırayı username.Length >= 3 && username != null olarak değiştirirseniz aynı çağrı çöker.

&&, ||'dan daha sıkı bağlanır, bu yüzden a || b && c, a || (b && c) demektir. İkisini karıştırdığınızda her zaman parantez ekleyin; derleyicinin onlara ihtiyacı yoktur, ama okuyucuların vardır. Tek karakterli & ve | de bool üzerinde çalışır, ama her zaman iki tarafı da değerlendirir. Onları yalnızca sağ tarafın mutlaka gerçekleşmesi gereken bir yan etkisi olduğunda kullanın.

Süslü Parantezler ve Tek İfade Kuralı

Bir dal tek bir ifade içerdiğinde süslü parantezler isteğe bağlıdır. Onlar olmadan, girinti ne derse desin, if'e yalnızca sonraki ifade aittir:

Çıktı:

Reorder email sent
Stock: 12

Stok yeterli olduğu halde "Reorder email sent" yazdırılır: girintiye rağmen ikinci WriteLine if'in dışındadır. if (x == null) return; gibi tek satırlık bir koruma süslü parantezsiz sorun değildir; ikinci bir satır kazanabilecek her şey onları almalıdır.

İlgili bir hata, koşuldan hemen sonra gelen noktalı virgüldür. if (stock < 5); if'i boş bir ifadeyle bitirir ve ardından gelen blok koşulsuz çalışır. Derleyici bunu CS0642, Possible mistaken empty statement uyarısıyla işaretler; bu uyarıyı hata gibi ele almaya değer.

Bir Koşulda = ile ==

= atar, == karşılaştırır. Çoğu tip için yanlışlıkla = yazmak derlenmez, çünkü bir atamanın sonucu atanan değerdir ve bir int bir bool değildir:

int score = 10;
if (score = 100) { }   // error CS0029: Cannot implicitly convert type 'int' to 'bool'

Bir bool değişkeniyle atamanın kendisi bir bool'dur, bu yüzden yazım hatası derlenir:

Çıktı:

Access granted
isAdmin is now True

Koşul isAdmin'in üzerine yazdı ve sonra yeni değeri test etti. Derleyici uyarır (CS0665, assignment in a conditional expression is always constant), ama derleme yine de başarılı olur. Bool'lar için karşılaştırmayı tamamen atlayın: if (isAdmin) ve if (!isAdmin) daha iyi okunur ve bu şekilde yanlış yazılamaz.

İç İçe if ile Koruma Cümleleri

Her iç içelik seviyesi, okuyucunun aklında tutması gereken bir koşul daha demektir. Her kontrol hatalı girdiyi reddediyorsa, mutlu yolu hepsinin içine yerleştirmek yerine erken dönün:

Çıktı:

ordered 2 x keyboard
error: no product
error: quantity must be positive
error: insufficient balance

Aynı metodun iç içe sürümünde, asıl iş en içteki blokta olan üç seviye if ve en altta çözülen üç else dalı olurdu. Koruma cümleleriyle her kural kendi hata mesajının yanında durur ve son satır normal durumdur. Aynı fikir döngülerde continue ile çalışır.

Koşulun İçinde Değişken Bildirmek

Bir koşul, if'in içinde kapsamda olan bir değişken bildirebilir. İki yaygın biçim, bir TryParse metodundan gelen out var ve is tip desenidir:

Çıktı:

42: positive number 42
abc: not a number
-7: number -7, not positive
string of length 5

TryParse hatalı girdide istisna fırlatmak yerine false döndürür; bu da onu bir if için doğal bir seçim yapar. Tip dönüşümü sayfası parse metotlarını ayrıntılı ele alır.

Başka Bir Şey Ne Zaman Kullanılmalı

  • İki değerden birini seçmek: koşul operatörü condition ? a : b, iki dalda da atama yapan bir if'ten daha kısadır.
  • Tek bir değer üzerinde çok sayıda dal: bir switch ifadesi bir değeri sabit durumlarla karşılaştırır ve on else if satırından daha kolay taranır.
  • Bir değeri bir sonuca eşlemek: dallar yalnızca veride farklılaştığında uzun bir zincirin yerini bir Dictionary araması alır.

Sıkça Sorulan Sorular

C#'ta else if nasıl yazılır?

else if'i iki kelime olarak yazın: if (a) { ... } else if (b) { ... } else { ... }. Koşullar yukarıdan aşağıya test edilir ve yalnızca ilk doğru dal çalışır, bu yüzden en özel testi en başa koyun. elif ya da elseif anahtar kelimesi yoktur.

C#'ta neden if (count) yazamıyorum?

Bir C# koşulu bool tipinde olmalıdır. C ve JavaScript'in aksine bir int, bir string ya da bir nesne asla true ya da false'a dönüştürülmez, bu yüzden if (count) CS0029, Cannot implicitly convert type 'int' to 'bool' ile başarısız olur. Kastettiğiniz testi yazın: if (count > 0) ya da if (name != null).

Bir if koşulunda && ile & arasındaki fark nedir?

&& kısa devre yapar: sol taraf false ise sağ taraf hiç değerlendirilmez; s != null && s.Length > 0'ı güvenli yapan budur. İki bool üzerinde & her seferinde iki tarafı da değerlendirir. Aynısı || ve | için geçerlidir. Sağ tarafın yan etkisine ihtiyacınız yoksa koşullarda && ve || kullanın.

Bir C# if ifadesinde süslü parantez zorunlu mu?

Hayır. Süslü parantez olmadan if tam olarak tek bir ifadeyi kontrol eder. İkinci bir satırı girintilemek onu dala eklemez; bu klasik bir hata kaynağıdır, bu yüzden çoğu stil kılavuzu her dalda süslü parantez önerir.

C#'ta if else tek satırda yazılabilir mi?

Bir değer seçmek için koşul operatörünü kullanın: string label = score >= 50 ? "pass" : "fail";. İfade çalıştırmak için if (x) DoA(); else DoB(); tek satırda geçerlidir, ama süslü parantezli bir bloktan okunması ve genişletilmesi daha zordur.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA