2013-01-07 13 views
8

mam poniżej kod (który faktycznie jest znacznie dłuższy niż widać!)Korzystanie `CONTINUE keywoard w gniazdo przełącznika wewnątrz pętli foreach

foreach (SensorPair sensor in _sensorPairs) 
{ 
    sensorByte = (byte) sensor.Sensor; 

    if (!packet.Contains(sensorByte)) 
     continue; 

    index = packet.IndexOf(sensorByte); 
    byteCount = sensor.ByteCount; 

    switch (byteCount) 
    { 
     case 1: 
      try 
      { 
       switch(sensor.ValueType) 
       { 
        case SensorValueType.Unsigned: 
         val = (int)packet[index + 1]; 
         if (val > 255) 
          //*** WHAT DOES THIS CONTINUE DO? 
          continue; 
         else //rise the event 
          OnSensorReport();        
        break; 

Czy continue keywoard widać powodować pętlę foreach rozpocząć iterację następnego elementu lub po prostu przechodzi do następnego oświadczenia case?

Jeśli nic nie robi z pętlą foreach, jak mogę wymusić na kodzie wyjście z przełącznika i rozpoczęcie kolejnej iteracji w pętli foreach?

+17

-1, kiedy to testowałeś, co się stało? –

+2

Czy próbowałeś? – MyCodeSucks

+2

Kontynuuje pętlę. Przechodzenie do następnego przypadku to "goto Case 2;". –

Odpowiedz

18

Tak, kontynuuje pętlę foreach.

Zawsze jest przydatna zasięgnąć opinii documentation ;-)

instrukcja continue przekazuje kontrolę do następnej iteracji zamykającego chwilę zrobić, bo albo oświadczenie foreach, w którym się pojawia.

lub — bardziej wszechstronne — C# language specification:

8.9.2 instrukcja continue

continue komunikatu rozpoczyna się nowa iteracja najbliższego załączając while, do, na lub oświadczenie foreach.

Cel instrukcji continue jest punktem końcowym wbudowanej instrukcji dla najbliższej instrukcji obejmującej: while, do, for lub foreach . Jeśli instrukcja continue nie jest zamknięta przez jakiś czas, wykonaj, dla lub instrukcji foreach, wystąpi błąd podczas kompilacji.

gdy wiele natomiast, czy, dla, lub oświadczenia foreach są zagnieżdżone w siebie, nadal oświadczenie dotyczy tylko do najgłębszej rachunku. Aby przenieść kontrolę na wiele poziomów zagnieżdżenia, należy użyć instrukcji goto (§8.9.3).

Instrukcja continue nie może wyjść z bloku finally (§8.10). Gdy instrukcja continue continue występuje w bloku finally, cel instrukcji continue continue musi znajdować się w tym samym bloku finally; w przeciwnym razie wystąpi błąd kompilacji .

continue instrukcja wykonywana jest w sposób następujący:

  • Jeśli instrukcja nadal wychodzi jeden lub więcej bloków spróbuj związanych wreszcie bloków, sterowanie jest początkowo przekazywane do końcu bloku z najbardziej wewnętrznej instrukcji try. Kiedy i jeśli kontrola osiągnie punkt końcowy bloku finally, sterowanie jest przenoszone do końcowego bloku następnej instrukcji try. Ten proces jest powtarzany, dopóki nie zostaną wykonane końcowe bloki wszystkich interweniujących instrukcji try .

  • Kontrola jest przekazywana do celu instrukcji continue .

Ponieważ oświadczenie kontynuować bezwarunkowo przekazuje sterowanie gdzie indziej, punkt końcowy oświadczeniu nadal nigdy nie jest osiągalny.

Powiązane problemy