2009-11-25 14 views
11

Görünüşe göre C# kullanarak anahtar ifademdeki her bir durum bloğunda bir ara vermem gerekiyor.C# geçiş/ara

Bunun nedenini bir sonraki durum bildirisine girebileceğiniz başka dillerde de görüyorum.

Kasa bloklarının diğer kasa bloklarına düşmesi mümkün mü?

Çok teşekkürler, gerçekten takdir!

cevap

29

Evet, sonraki durum satırına iki şekilde düşebilirsiniz. Bir molaya ihtiyacım yok boş vakaları kullanabilir veya bir sonraki (ya da herhangi bir) durumda atlamak için goto kullanabilirsiniz:

switch (n) { 
    case 1: 
    case 2: 
    case 3: 
    Console.WriteLine("1, 2 or 3"); 
    goto case 4; 
    case 4: 
    Console.WriteLine(4); 
    break; 
} 
+1

Boş durum bildirimleri yasal değildir ve 'durum 1' buna karşı değildir. [Eric Lippert'ın Açıklaması] 'na bakın (http://stackoverflow.com/questions/3047863/how-can-i-use-more-than-one-constant-for-a-switch-case-in-c/3049601#3049601), yanı sıra neden ayrımı pedantic olmadığını belirten yorumum. İnsanlara boş dava bloklarının yasal olduğunu söylemesi [hata yapmasına neden olur] (http://stackoverflow.com/q/8071655/18192). – Brian

+3

@Brian: İsterseniz başka bir şey diyebilirsiniz, ancak yukarıdaki kod tamamen yasaldır. Teknik olarak, kod elbette, içine düştüğünüz bir dizi kod bloğu olarak uygulanmayacaktır, ancak bu, herhangi bir dilde geçerli değildir ve çoğu kontrol yapısı hakkında da söylenebilir. Bağlandığınız hata, boş olmadığı için boş vakalarla (veya onları aramak istediğinizde) ilgili değildir. – Guffa

2

C# yapı aracılığıyla örtük düşüş desteklemez, ancak break (veya goto) yine orada olmak (msdn) sahiptir. Yapabileceğiniz tek şey aşağıdaki şekilde vakaları yığını edilir:

switch(something) { 
    case 1: 
    case 2: 
     //do something 
     break; 
    case 3: 
     //do something else 
} 

ama bu break (veya goto gibi başka atlama tablosu) sadece orada olması gerekiyor.

+0

Bu tam olarak doğru değil. Bu bir "atlama" ifadesinin (yani, kırmak, devam etmek, goto, geri dönüş veya atmak anlamına geldiğini düşündüğüm) sonuçta olması gerektiği değil, ulaşılamaz bir son noktaya sahip bir ifadenin sonunda olması gerektiğidir. Tüm "atlama" ifadeleri bu mülke sahiptir, ancak bu özellik ile başka ifadeler de vardır. Örneğin, nadiren de olsa, "while (true) M();" –

+1

MSDN belgelerinin yanlış olduğunu görüyorum. Belge yöneticisi ile konuşacağım. –

5

"mola" nin icra böcek durdurmak için vardır. Eğer aracılığıyla sonbahar-a zorlamak gerekiyorsa o zaman

Aşağıdaki örnek neler yapabileceğini gösteriyor (uygun değerle değiştirin) "git durumda" kullanın:

switch(n) 
{ 
    case 1: 
    case 2: 
     //do something for 1+2 
     //... 
     goto case 3; 
    case 3: 
     //do something for 3, and also extra for 1+2 
     //... 
     break; 
    default: 
     //do something for all other values 
     //... 
     break; 
} 

yılında http://msdn.microsoft.com/en-us/library/06tc147t%28VS.80%29.aspx

+1

Düşüşü desteklemiyorsa, önlenecek bir hata yoktur. Bir ara var olup olmadığı, eğer dil desteklenmiyorsa, desteklemiyor, alt satır.'Break' derleme zaman zorlama, 'yanlışlıkla yanlışlıkla düşmesini engellemez, çünkü dediğiniz gibi, düşmek bile desteklenmez bu yüzden böyle bir kaza gerçekleşemez ... – AaronLS

0

Bkz benim C# (.NET 1.1, CF) kodu, bunlardan ikisi izin verilir:

switch (_printerChoice) 
{ 
    case BeltPrintersEnum.ZebraQL220: 
     return new ZebraQL220Printer(); 
     break; 
    case BeltPrintersEnum.ONeal: 
     return new ONealPrinter(); 
     break; 
    default:    
     return new ZebraQL220Printer();   
         break; 
} 

switch (_printerChoice) 
{ 
    case BeltPrintersEnum.ZebraQL220: 
     return new ZebraQL220Printer(); 
    case BeltPrintersEnum.ONeal: 
     return new ONealPrinter(); 
    default:    
     return new ZebraQL220Printer();   
} 

... ama çok belirsiz olarak kabul onlar gri renktedir, içinde araları ile. Yani, en azından benim durumumda, izin verilir, ancak gerekli değildir.

+1

Bir return ifadesi (yanı sıra, istisnalar atma) neden olur Tam bir yöntem bırakma kodu, o zaman neden aşağıdaki bir break deyimi gerekli değildir. Artık ayrılmak için bir anahtar yapısı yoktur. – Udontknow