C # 'da if / else ve switch-case kullanma arasında önemli bir fark var mı?


219

C # 'da bir switchdeyim kullanmanın faydası / dezavantajı nedir if/else. Belki de kodunuzun görünümü dışında, büyük bir fark olduğunu düşünemiyorum.

Ortaya çıkan IL veya ilişkili çalışma zamanı performansının kökten farklı olması için herhangi bir neden var mı?

İlgili: Daha hızlı, dizeyi aç veya türünde elseif nedir?



3
Kendinizi sık sık TEK MİLYAR kez yinelediğinizi düşünmedikçe, bu soru yalnızca geliştiricilerin çoğunluğu için teoride ilginçtir. (Daha sonra bir anahtar deyimi kullanın ve 48 ila 43 saniye arasında gidin ...) Veya Donald Knuth'un sözleriyle: "Küçük verimlilikleri unutmalıyız, zamanın yaklaşık% 97'sini söyleyin: erken optimizasyon tüm kötülüğün köküdür" en.wikipedia.org/wiki/Program_optimization#When_to_optimize
Sire

Anahtarın sakat paylaşılan kapsamı nedeniyle genellikle anahtar yerine if / else komutunu kullanıyorum.
Josh

Yanıtlar:


341

SWITCH deyimi yalnızca hata ayıklama veya uyumluluk modundaki IF'lerle aynı derlemeyi üretir. Serbest bırakıldığında, atlama tablosuna derlenecektir (MSIL 'switch' deyimi aracılığıyla) - O (1).

C # (diğer birçok dilden farklı olarak) dize sabitlerini açmaya izin verir - ve bu biraz farklı çalışır. Açıkçası keyfi uzunluktaki dizeler için atlama tabloları oluşturmak pratik değildir, bu nedenle çoğu zaman bu anahtar IF'lerin yığınında derlenecektir.

Ancak koşulların sayısı ek yükleri kapsayacak kadar büyükse, C # derleyicisi bir HashTable nesnesi oluşturur, onu dize sabitleriyle doldurur ve bu tablodan sonra atlama yapar. Hashtable araması kesinlikle O (1) değildir ve fark edilebilir sabit maliyetlere sahiptir, ancak vaka etiketlerinin sayısı büyükse, IFs'deki her dize sabitiyle karşılaştırıldığında önemli ölçüde daha hızlı olacaktır.

Özetlemek gerekirse, koşul sayısı 5'ten fazlaysa, IF yerine SWITCH'i tercih edin, aksi takdirde daha iyi görünen her şeyi kullanın.


1
C # derleyicisinin bir karma tablo üreteceğinden emin misiniz? Yukarıdaki yorum tartışmamızda karma tablo hakkında yaptığım nokta, C # derleyicisi değil, yerel derleyiciler hakkındaydı. C # derleyicisi bir karma tablosu oluşturmak için hangi eşiği kullanır?
Scott Wisniewski

8
Yaklaşık on sanırım. 20 güvenli tarafta olmak. Ve btw, öfkem sen değilsin, ama onur ve kabul eden insanlar.
ima

48
Biraz deneme, sayı <= 6: "if"; sayısı> = 7: sözlük. Bu MS .NET 3.5 C # derleyicisiyle - tabii ki sürümler ve satıcılar arasında değişebilir.
Jon Skeet

37
Hey, sana bir özür borçluyum. Kemik başı olduğum için üzgünüm.
Scott Wisniewski

Bir takip olarak, pratik uygulamalar için, çoğu zaman gerçek dünya farkı var mıdır? C # 'daki anahtar ifadelerini tuhaf buluyorum, sözdizimleri başka hiçbir şeye benzemiyor ve kodumu daha az okunabilir hale getiriyorlar, anahtar ifadelerini kullanmak için uğraşmaya değer mi, yoksa sadece ifs ile programlamalıyım ve sadece gelmeliyim performans darboğazları vurursam onları geri ve değiştirmek?
Jason Masters

54

Genel olarak (tüm diller ve tüm derleyiciler göz önünde bulundurularak) bir anahtar ifadesi, bir / / ifadesinden daha verimli olabilir, çünkü bir derleyicinin anahtar ifadelerinden atlama tabloları oluşturması kolaydır. Aynı şeyleri uygun kısıtlamalar verildiğinde if / else ifadeleri için yapmak mümkündür, ancak bu çok daha zordur.

C # söz konusu olduğunda, bu da geçerlidir, ancak başka nedenlerle.

Çok sayıda dizeyle, switch deyimini kullanmanın önemli bir performans avantajı vardır, çünkü derleyici atlama işlemini uygulamak için bir karma tablo kullanacaktır.

Az sayıda dizeyle, ikisi arasındaki performans aynıdır.

Bunun nedeni, bu durumda C # derleyicisinin bir atlama tablosu oluşturmamasıdır. Bunun yerine, IF / ELSE bloklarına eşdeğer MSIL üretir.

Bir "switch deyimi" MSIL talimatı, açıldığında bir switch deyimi uygulamak için bir atlama tablosu kullanacaktır. Ancak yalnızca tamsayı türleriyle çalışır (bu soru dizeleri sorar).

Az sayıda dize için, derleyicinin IF / ELSE blokları üretmesi daha verimli olur, daha sonra bir karma tablosu kullanmaktır.

Başlangıçta bunu fark ettiğimde, IF / ELSE bloklarının az sayıda dizeyle kullanıldığı için, derleyicinin çok sayıda dizge için aynı dönüşümü yaptığını varsaydım.

Bu YANLIŞ idi. 'IMA' bunu bana işaret edecek kadar nazikti (iyi ... bu konuda nazik değildi, ama haklıydı ve yanılmışım, önemli olan bu)

Ayrıca MSIL'de bir "anahtar" talimatının olmaması konusunda kemik kafalı bir varsayım yaptım (bir anahtar ilkel varsa, neden bir karma tablo ile kullanmıyorlardı, bu yüzden bir anahtar ilkel olmamalı. ...). Bu hem yanlış hem de inanılmaz derecede aptalcaydı. Yine 'IMA' bunu bana gösterdi.

Güncellemeleri burada yaptım çünkü en yüksek puan alan yazı ve kabul edilen cevap.

Ancak, Topluluk Wiki'sini yaptım çünkü REP'yi yanlış olduğu için hak etmediğimi düşünüyorum. Eğer bir şansınız varsa, lütfen 'ima' yazısını oylayın.


3
MSIL'de bir anahtar ilkel vardır ve c # ifadeleri genellikle C-benzeri aramaya derlenir. Belirli koşullar altında (hedef platform, cl anahtarları vb.) Anahtar, derleme sırasında IF'lere genişletilebilir, ancak bu yalnızca bir geri dönüş uyumluluk ölçüsüdür.
ima

6
Tek yapabileceğim aptalca bir hata yaptığı için özür dilemek. İnan bana, bunun hakkında aptal hissediyorum. Cidden olsa da, bunun hala en iyi cevap olduğunu düşünüyorum. Yerel derleyicilerde, bir atlama uygulamak için bir karma tablo kullanmak mümkündür, bu yüzden bu korkunç bir şey değildir. Bir hata yaptım.
Scott Wisniewski

9
ima, hatalar varsa bunları belirtin. Scott gibi sesler yazıyı düzeltmekten mutluluk duyacaktır. Değilse, bir yanıtı düzeltme yeteneğine sahip olanlar bunu yapacaktır. Böyle bir sitenin çalışmasının tek yolu budur ve genel olarak işe yarıyor gibi görünüyor. Veya topu alıp eve git :)
jwalkerjr

2
@Scott: "Dizeler için" açıkça belirtmek için ikinci ve üçüncü paragrafları düzenlemenizi öneririm. Kullanıcılar güncellemeyi en altta okuyamayabilir.
Jon Skeet

4
@ima Bir cevabın objektif olarak yanlış olduğunu düşünüyorsanız, doğru olarak düzenleyin. Bu yüzden herkes cevapları düzenleyebilir.
Miles Rout

18

Tercih etmek için üç neden switch:

  • Yerel kodu hedefleyen bir derleyici genellikle bir koşullu dal artı bir dolaylı atlama içine bir anahtar deyimi derleyebilirken , bir ifs dizisi bir koşullu dallar dizisi gerektirir . Vakaların yoğunluğuna bağlı olarak vaka bildirimlerinin nasıl verimli bir şekilde derleneceği hakkında çok sayıda öğrenilmiş makale yazılmıştır; bazıları lcc derleyici sayfasından bağlanır . (Lcc anahtarlar için daha yenilikçi derleyicilerden birine sahipti.)

  • Anahtar deyimi, birbirini dışlayan alternatifler ve anahtar sözdizimi arasında bir seçimdir , bu kontrol akışını programcıya daha şeffaf hale getirir, sonra if-then-else deyimlerinin bir yuvasını oluşturur.

  • Kesinlikle ML ve Haskell dahil olmak üzere bazı dillerde, derleyici herhangi bir vakayı bırakıp bırakmadığınızı kontrol eder . Bu özelliği ML ve Haskell'in en büyük avantajlarından biri olarak görüyorum. C # bunu yapabilir mi bilmiyorum.

Bir fıkra: Yaşam boyu başarı ödülü üzerine verdiği bir derste Tony Hoare'nin kariyerinde yaptığı her şeyden en çok gurur duyduğu üç şey olduğunu söylediğini duydum:

  • Quicksort icat
  • Anahtar ifadesini icat etme (Tony caseifadeyi çağırdı )
  • Endüstride kariyerine başlamak ve bitirmek

Ben olmadan yaşamayı hayal edemezswitch .


16

Derleyici hemen hemen her şeyi küçük kodlarla (Knuth, kimse?) Aynı koda optimize edecek.

Aradaki fark, başka ifadelerin birbirine çarpması durumunda bir anahtar ifadesinin onbeşten daha temiz olmasıdır.

Arkadaşlar, if-else ifadelerini istiflemelerine izin vermez.


13
"Arkadaşlar, if-else ifadelerini istiflemelerine izin vermez." Bir bumber sitcker yapmalısın :)
Matthew M. Osborn

14

Aslında, bir anahtar deyimi daha verimlidir. Derleyici, eğer if / else ifadeleriyle bunu yapamayacağı bir arama tablosuna optimize eder. Aşağı tarafı, bir switch ifadesinin değişken değerlerle kullanılamamasıdır.
Yapamazsın:

switch(variable)
{
   case someVariable
   break;
   default:
   break;
}

olmak zorunda

switch(variable)
{
  case CONSTANT_VALUE;
  break;
  default:
  break;
}

1
Herhangi bir numaran var mı? Bir derleyicinin If / Else üzerinden bir swtich deyimini ne kadar iyi optimize edebileceğini merak ediyorum
Matthew M. Osborn

evet Ben bir switch deyimi her zaman bir if else ifadesi O (n) olacak şekilde n (if / else if ifadelerinde doğru değerin konumudur) O (1) optimize eder inanıyorum.
kemiller2002

C # durumunda bu doğru değildir, daha fazla bilgi için aşağıdaki yazıma bakınız.
Scott Wisniewski

Bundan tam olarak emin değilim, ama yemin ettiğim kitapta bilgi bulamıyorum. Optimizasyon olmadan MSIL koduna bakmadığınızdan emin misiniz? Optimizasyon ile derlenmedikçe atlama tablosunu oluşturmaz.
kemiller2002

Hem hata ayıklama hem de perakende modunda derledim ve her iki durumda da if / else blokları üretir. Baktığınız kitabın C # hakkında konuştuğundan emin misiniz? Kitap muhtemelen bir derleyici kitabı ya da C veya C ++ hakkında bir kitaptı
Scott Wisniewski

14

Başka hiç kimsenin (açık?) Noktasını değiştirdiğini ve anahtar ifadesinin sözde verimlilik avantajının çeşitli vakaların yaklaşık olarak eşit olması gerektiğine bağlı olduğunu görmedim. Değerlerden birinin (veya birkaçının) çok daha olası olduğu durumlarda, en yaygın durumların ilk önce kontrol edilmesini sağlayarak if-then-else merdiveni çok daha hızlı olabilir:

Yani mesela:

if (x==0) then {
  // do one thing
} else if (x==1) {
  // do the other thing
} else if (x==2) {
  // do the third thing
}

vs

switch(x) {
  case 0: 
         // do one thing
         break;
  case 1: 
         // do the other thing
         break;
  case 2: 
         // do the third thing
         break;
}

X, zamanın% 90'ını sıfırsa, "if-else" kodu, anahtar tabanlı kodun iki katı kadar hızlı olabilir. Derleyici "anahtarı" bir tür akıllı tabla odaklı goto haline getirse bile, yine de sadece sıfırı kontrol etmek kadar hızlı olmayacaktır.


3
Erken optimizasyon yok! Genel olarak, sadece birkaç durumdan fazlasına sahipseniz ve bunlar switchuyumluysa, switchifade daha iyidir (daha okunabilir, bazen daha hızlı). Bir vakanın çok daha olası olduğunu biliyorsanız , bunu bir if- else- switchyapı oluşturmak için dışarı çekebilirsiniz ve eğer ölçülebilir şekilde daha hızlıysa , bunu bırakın. Eğer switchdejenere ve çok küçük olur, bir bir dönüştürülmesi çalışmalarının çoğunu yapacağız regex değiştirme else ifzincirindeki.
kimse

6
Orijinal soru (üç yıl önce!) Sadece if / else ve switch arasında avantaj ve dezavantajlar istedi. Bu bir örnek. Kişisel olarak bu tür bir optimizasyonun rutin çalışma süresinde önemli bir fark yarattığını gördüm.
Mark Bessey

7

genellikle daha iyi görünür - yani neler olduğunu anlamak daha kolay olacaktır. Performans avantajının en iyi ihtimalle çok az olacağı düşünüldüğünde, kodun görünümü en önemli farktır.

Bu nedenle, if / else daha iyi görünüyorsa, kullanın, aksi takdirde bir switch ifadesi kullanın.


4

Yan konu, ancak sık sık endişeleniyorum (ve daha sık görüyorum) if/ elseveswitch ifade çok fazla durumda çok büyük oluyor. Bunlar genellikle sürdürülebilirliğe zarar verir.

Ortak suçlular şunları içerir:

  1. Birden çok if ifadesinin içinde çok fazla şey yapma
  2. Analiz etmek insanca mümkün olandan daha fazla vaka ifadesi
  3. Ne değerlendirildiğini bilmek için if değerlendirmesinde çok fazla koşul var

Düzeltmek:

  1. Yöntem yeniden düzenleme için ayıklayın.
  2. Vaka yerine yöntem işaretçileri olan bir Sözlük kullanın veya ek yapılandırılabilirlik için bir IoC kullanın. Yöntem fabrikaları da yardımcı olabilir.
  3. Koşulları kendi yöntemlerine ayıklayın

4

Bu bağlantıya göre, IF vs Switch anahtarını kullanarak yineleme testinin karşılaştırılması ve if ifadesi, 1.000.000.000 yineleme gibidir, Anahtar Deyimi = 43.0s ve If Deyimi = 48.0s

Tam anlamıyla saniyede 20833333 yineleme, Yani, gerçekten daha fazla odaklanmamız gerekir mi,

Not: Sadece küçük koşullar listesi için performans farkını bilmek.


Bu benim için çivi.
Greg Gum

3

Sadece if veya else deyimini kullanıyorsanız temel çözüm karşılaştırma kullanıyor mu? Şebeke

(value == value1) ? (type1)do this : (type1)or do this;

Bir anahtarda veya rutini yapabilirsiniz

switch(typeCode)
{
   case TypeCode:Int32:
   case TypeCode.Int64:
     //dosomething here
     break;
   default: return;
}

2

Bu aslında sorunuza cevap vermiyor, ancak derlenmiş sürümler arasında çok az fark olacağı için, kodunuzu niyetlerinizi en iyi açıklayacak şekilde yazmanızı tavsiye ederim. Derleyicinin beklediğiniz şeyi yapması için daha iyi bir şans değil, aynı zamanda başkalarının kodunuzu korumasını da kolaylaştıracaktır.

Amacınız, programınızı bir değişkenin / özniteliğin değerine göre dallamaksa, bir switch ifadesi bu amacı en iyi şekilde temsil eder.

Amacınız programınızı farklı değişkenlere / niteliklere / koşullara göre dallamaksa, bir if / else zinciri bu amacı en iyi temsil ediyorsa.

Cody'nin break komutunu unutan insanlar için doğru olduğunu söyleyeceğim, ancak neredeyse {} yanlış aldıkları blokları karmaşık hale getirdiklerini görüyorum, bu nedenle koşullu ifadede olması gereken satırlar değil. Her zaman benim nedenlerimden biri bir satır olsa bile if} ifadelerime {} biri budur. Sadece okumak daha kolay değil, aynı zamanda koşullu başka bir satır eklemem gerekirse, eklemeyi unutamıyorum.


2

Faiz sorusu. Bu birkaç hafta önce iş yerinde geldi ve örnek bir pasaj yazarak ve .NET Reflector'da görüntüleyerek bir cevap bulduk (reflektör harika !! i love it).

Bizim keşfettiğimiz budur: Bir dize dışında herhangi bir şey için geçerli bir switch deyimi, IL'ye bir switch deyimi olarak derlenir. Ancak bir dize ise IL'de if / else if / else olarak yeniden yazılır. Bizim durumumuzda, switch ifadelerinin dizeleri nasıl karşılaştırdığını öğrenmek istedik, örneğin büyük / küçük harfe duyarlıdır ve reflektör bize hızlı bir şekilde cevap verdi. Bunu bilmek faydalı oldu.

Eğer küçük harfe duyarlı dizeleri üzerinde karşılaştırma yapmak istiyorsanız o zaman olabilir daha hızlı bir if / else bir String.Compare gerçekleştirme geride olduğu bir switch deyimi kullanırlar. (Düzenle: Okuma Daha hızlı olan nedir, bazı gerçek performans testleri için dizeyi veya elseif'i aç?

switch (myString.ToLower())
{
  // not a good solution
}

En iyi kural, mantıklıysa (ciddi olarak) anahtar ifadelerini kullanmaktır, örneğin:

  • kodunuzun okunabilirliğini artırır
  • bir dizi değeri (float, int) veya bir numaralandırmayı karşılaştırıyorsunuz

Switch deyimine beslemek için değeri değiştirmeniz gerekiyorsa (geçiş yapmak için geçici bir değişken oluşturun), muhtemelen bir if / else kontrol deyimi kullanmanız gerekir.

Bir güncelleme:

Dizeyi büyük harfe (örn. ToUpper()) Dönüştürmek daha iyidir çünkü görünüşe göre tam zamanında derleyicinin ile karşılaştırıldığında yapabileceği başka optimizasyonlar vardır ToLower(). Mikro bir optimizasyondur, ancak sıkı bir döngüde yararlı olabilir.


Küçük bir yan not:

Anahtar ifadelerinin okunabilirliğini artırmak için aşağıdakileri deneyin:

  • en olası dalı önce koy, yani en çok erişilen
  • hepsinin meydana gelme olasılığı varsa, onları daha kolay bulmak için alfabetik olarak sıralayın.
  • kalan son durum için hiçbir zaman varsayılan yakalama özelliğini kullanmayın, bu tembeldir ve daha sonra kodun ömründe sorunlara neden olur.
  • bilinmeyecek bir durumu ileri sürecek gibi görünmese de varsayılan catch-all işlevini kullanın. iddiaları için iyi olan budur.

Çoğu durumda ToLower () kullanmak doğru çözümdür, özellikle de çok sayıda vaka varsa ve karma tablosu oluşturulursa.
Blaisorblade

"Switch deyimine beslemek için değeri değiştirmeniz gerekiyorsa (geçiş yapmak için geçici bir değişken oluşturun), muhtemelen bir if / else kontrol deyimi kullanıyor olmalısınız." - İyi tavsiye, teşekkürler.
Sneakyness

2

Switch deyimi kesinlikle eğer if ise daha hızlıdır. Üzerinde BlackWasp tarafından sağlanan en hızlı test var

http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

--Bunu kontrol et

Ancak, büyük ölçüde hesap vermeye çalıştığınız olasılıklara bağlıdır, ancak mümkün olduğunda bir anahtar ifadesi kullanmaya çalışıyorum.


1

Sadece C # değil, tüm C tabanlı diller, bence: bir anahtar sabitler ile sınırlı olduğundan, bir "atlama tablosu" kullanarak çok verimli bir kod oluşturmak mümkündür. C durumu gerçekten iyi bir eski FORTRAN hesaplanmış GOTO, ancak C # durumu hala bir sabite karşı testler.

Optimize edicinin aynı kodu yapması söz konusu değildir. Örneğin,

if(a == 3){ //...
} else if (a == 5 || a == 7){ //...
} else {//...
}

Bunlar bileşik boolean olduğundan, oluşturulan kod bir değer ve kısa devre hesaplamak zorundadır. Şimdi eşdeğerini düşünün

switch(a){
   case 3: // ...
    break;
   case 5:
   case 7: //...
    break;
   default: //...
}

Bu içine derlenebilir

BTABL: *
B3:   addr of 3 code
B5:
B7:   addr of 5,7 code
      load 0,1 ino reg X based on value
      jump indirect through BTABL+x

çünkü derleyiciye OR ve eşitlik testlerini hesaplaması gerekmediğini söylüyorsunuz.


Optim uygulandığı sürece, iyi bir optimize edicinin 1. kodu işleyememesi için hiçbir neden yoktur. "Derleyici optimize edemez" sadece insanın uzlaşabileceği anlamsal farklılıklara bağlıdır (yani f () çağrılırsa, f () her zaman 0 veya 1 döndürür).
Blaisorblade

0

Cs profesörüm ifadeleri değiştirmemenizi önerdi çünkü insanlar molaları çok sık unuttular veya yanlış kullandılar. Tam olarak ne dediğini hatırlayamıyorum, ancak geçiş ifadesinin örneklerini (yıllar önce) gösteren bazı seminal kod tabanına bakan bir şeyde de tonlarca hata vardı.


C # 'da gerçekten bir sorun değil. Korku içinde yaşamanın neden en iyi politika olmayabileceğine dair tartışma için bkz. Stackoverflow.com/questions/174155/… ... ve ayrıca stackoverflow.com/questions/188461/…
adresini okuyun

0

Az önce fark ettiğim bir şey, if / else komutunu birleştirip deyimleri değiştirebilmenizdir! Ön koşulları kontrol etmek gerektiğinde çok kullanışlıdır.

if (string.IsNullOrEmpty(line))
{
    //skip empty lines
}
else switch (line.Substring(0,1))
{
    case "1":
        Console.WriteLine(line);
        break;
    case "9":
        Console.WriteLine(line);
        break;
    default:
        break;
}

3
Bunun eski olduğunu biliyorum, ama teknik olarak hiçbir şeyi "birleştirmediğinizi" düşünüyorum. Kıvırcık parantez olmadan "else" olduğunda, bir sonraki ifade yürütülür. Bu ifade, genellikle bir sonraki satırda girintili olarak gösterilen tek satırlık bir ifade veya if, switch, using, lock vb. başka anahtar "," başka kullanarak ", vb. Bunu söyledikten sonra, nasıl göründüğünü ve neredeyse kasıtlı görünmesini seviyorum. (Feragatname: Tüm bunları denemedim, bu yüzden yanlış olabilir!)
Nelson Rothermel

Nelson,% 100 haklısın. Bu cevabı gönderdikten sonra bunun neden olduğunu anladım.
Hatta Mien

0

Sanırım Switch, Şundan Daha Hızlı Oldu Gibi Koşullar:

Herhangi bir sayı girmek için bir Program yazın (1 - 99 arasında) ve a) 1 - 9 ve ardından 1 numaralı slotta b) 11 - 19 sonra 2 numaralı c) 21-29 numaralı slotları kontrol edin ve 89- 99

Sonra Birçok Koşul Yapmanız Gerekiyorsa Ama Oğlu Anahtar Kasası Sadece Yazmanız Gerekiyorsa

Anahtar (no / 10)

ve vaka 0 = 1-9, vaka 1 = 11-19 vb.

çok kolay olacak

Bunun gibi daha birçok örnek var!


0

bir anahtar deyimi temel olarak eşitlik için bir karşılaştırmadır. klavye olayları, kod yazması ve okunması kolay olduğunda switch ifadelerine göre büyük bir avantaja sahiptir.

char abc;
switch(abc)
{
case a: break;
case b: break;
case c: break;
case d: break;
}

Eğer (theAmountOfApples 5 && theAmountOfApples 10'dan küçükse) bir ififif deyimi birden fazla çözüm için harikadır (aAuntuntOfApples 10'dan büyükse || aAuntuntOfApples == 100) elmalarınızı saklayın. C # veya c ++ yazmıyorum ama java öğrenmeden önce öğrendim ve yakın diller.


0

Anahtar ifadelerinin olası bir dezavantajı, çoklu koşulların olmamasıdır. Bir anahtarda farklı koşullara sahip if (else) ancak birden çok olgu deyimi için birden çok koşulunuz olabilir.

Anahtar ifadeleri, basit Boole denklemlerinin / ifadelerinin kapsamı dışındaki mantık işlemleri için uygun değildir. Bu Boole denklemleri / ifadeleri için son derece uygundur, ancak diğer mantık işlemleri için uygun değildir.

If ifadelerinde bulunan mantıkla çok daha fazla özgürlüğe sahip olursunuz, ancak If ifadesi uygunsuz hale gelirse veya kötü işlenirse okunabilirlik zarar görebilir.

Her ikisinin de karşı karşıya olduğunuz şeyin bağlamına bağlı olarak bir yeri vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.