[ Pobierz całość w formacie PDF ]
lub foreach. Jeśli instrukcji break nie obejmuje instrukcja switch, while, do, for lub foreach,
generowany jest błąd czasu kompilacji.
Gdy wiele instrukcji switch, while, do, for lub foreach jest zagnieżdżonych w sobie, instrukcja
break jest stosowana jedynie do najbardziej wewnętrznej instrukcji obejmującej. Aby przekazać
sterowanie przez wiele zagnieżdżonych poziomów, trzeba skorzystać z instrukcji goto (opisanej
w punkcie 8.9.3).
Instrukcja break nie może spowodować opuszczenia bloku finally (o czym więcej w podroz-
dziale 8.10). Gdy instrukcja break występuje w ramach bloku finally, cel tej instrukcji musi znaj-
dować się w tym samym bloku finally. W innym przypadku generowany jest błąd czasu kompilacji.
Instrukcja break jest wykonywana w następujący sposób:
" Jeśli instrukcja break powoduje opuszczenie jednego lub większej liczby bloków try z powią-
zanymi blokami finally, sterowanie jest początkowo przekazywane do bloku finally najbar-
dziej wewnętrznej instrukcji try. Gdy i jeśli sterowanie osiąga końcowy punkt bloku finally,
jest ono przekazywane do bloku finally kolejnej obejmującej instrukcji try. Proces ten jest
powtarzany aż do momentu wykonania bloków finally wszystkich ingerujących instrukcji try.
" Sterowanie jest przekazywane do celu instrukcji break.
Ponieważ instrukcja break bezwarunkowo przekazuje sterowanie w jakieś inne miejsce, końcowy
punkt tej instrukcji nigdy nie jest osiągalny.
399
8. Instrukcje
8.9.2. Instrukcja continue
Instrukcja continue powoduje rozpoczęcie nowej iteracji najbliższej obejmującej instrukcji while,
do, for lub foreach:
instrukcja-continue:
continue ;
Celem instrukcji continue jest końcowy punkt najbliższej instrukcji osadzonej najbliższej obej-
mującej instrukcji while, do, for lub foreach. Jeśli instrukcji continue nie obejmuje instrukcja
while, do, for lub foreach, generowany jest błąd czasu kompilacji.
Gdy wiele instrukcji while, do, for lub foreach jest zagnieżdżonych w sobie, instrukcja continue
jest stosowana jedynie do najbardziej wewnętrznej instrukcji obejmującej. Aby przekazać ste-
rowanie przez wiele zagnieżdżonych poziomów, trzeba skorzystać z instrukcji goto (opisanej
w punkcie 8.9.3).
Instrukcja continue nie może spowodować opuszczenia bloku finally (o którym więcej w pod-
rozdziale 8.10). Gdy instrukcja continue występuje w ramach bloku finally, cel tej instrukcji musi
znajdować się w tym samym bloku finally. W innym przypadku generowany jest błąd czasu
kompilacji.
Instrukcja continue jest wykonywana w następujący sposób:
" Jeśli instrukcja continue powoduje opuszczenie jednego lub większej liczby bloków try z powią-
zanymi blokami finally, sterowanie jest początkowo przekazywane do bloku finally najbar-
dziej wewnętrznej instrukcji try. Gdy i jeśli sterowanie osiąga końcowy punkt bloku finally,
jest ono przekazywane do bloku finally kolejnej obejmującej instrukcji try. Proces ten jest
powtarzany aż do momentu wykonania bloków finally wszystkich ingerujących instrukcji try.
" Sterowanie jest przekazywane do celu instrukcji continue.
Ponieważ instrukcja continue bezwarunkowo przekazuje sterowanie w jakieś inne miejsce, koń-
cowy punkt tej instrukcji nigdy nie jest osiągalny.
8.9.3. Instrukcja goto
Instrukcja goto powoduje przekazanie kontroli do instrukcji oznaczonej za pomocą etykiety:
instrukcja-goto:
goto identyfikator ;
goto case wyrażenie-stałe ;
goto default ;
Celem instrukcji goto identyfikator instrukcja oznaczona za pomocą danej etykiety. Jeśli etykieta
o podanej nazwie nie istnieje w bieżącej funkcji składowej lub jeśli instrukcja goto nie znajduje się
400
8.9. Instrukcje skoku
w zakresie tej etykiety, generowany jest błąd czasu kompilacji. Reguła ta dopuszcza używanie in-
strukcji goto w celu przekazywania kontroli poza zagnieżdżony zakres, nie da się jednak zrobić
tego do zagnieżdżonego zakresu. W przedstawionym poniżej przykładzie:
using System;
class Test
{
static void Main(string[] args) {
string[,] table = {
{"Czerwony", "Niebieski", "Zielony"},
{"Poniedziałek", "Zroda", "Piątek"}
};
foreach (string str in args) {
int row, colm;
for (row = 0; row
for (colm = 0; colm
if (str == table[row,colm])
goto done;
Console.WriteLine("{0} nieznaleziony", str);
continue;
done:
Console.WriteLine("Znaleziony {0} na pozycji [{1}][{2}]", str, row, colm);
}
}
}
instrukcja goto jest używana do przekazywania sterowania poza zagnieżdżony zakres.
Celem instrukcji goto case jest lista instrukcji znajdująca się w bezpośrednio obejmującej instruk-
cji switch (o której więcej w punkcie 8.7.2), która zawiera etykietę case z odpowiednią wartością
stałą. Jeśli żadna instrukcja switch nie obejmuje instrukcji goto case, jeśli wyrażenie-stałe nie
jest niejawnie konwertowalne (o czym więcej w podrozdziale 6.1) na typ rządzący najbliższą
obejmującą instrukcją switch lub jeśli najbliższa obejmująca instrukcja switch nie zawiera etykiety
case z odpowiednią wartością stałą, generowany jest błąd czasu kompilacji.
Celem instrukcji goto default jest lista instrukcji znajdująca się w bezpośrednio obejmującej
instrukcji switch (o której więcej w punkcie 8.7.2), która zawiera etykietę default z odpowiednią
wartością stałą. Jeśli żadna instrukcja switch nie obejmuje instrukcji goto case lub jeśli najbliż-
[ Pobierz całość w formacie PDF ]