Aby zobrazować dobre wykorzystanie goto przedstawię ci kod. 2 razy iterujemy po macierzy. Jeżeli znajdziemy element, który ma wartość 0 to kończymy tą podwójną pętle. Do tego będziemy potrzebować przerwania pierwszej pętli oraz zmienną informującą o tym czy zostało dokonane przerwanie. Przydałaby się instrukcja doublebreak, która mogłaby zakończyć dwie pętle :/
int[,] ints = new int[2, 2]; for (int i = 0; i < 2; i++) { bool breakSet = false; for (int j = 0; j < 2; j++) { if (ints[0, 0] == 0) //check if is zero { breakSet = true; break; } } if (breakSet) { break; } }
Ok, kod jest prosty. Dajmy na to, że zamiast 2 pętli for mamy 4 pętle for.
int oneDimSize = 2; int[, , ,] ints = new int[oneDimSize, oneDimSize, oneDimSize, oneDimSize]; bool breakSetForI = false; for (int i = 0; i < oneDimSize; i++) { bool breakSetForJ = false; for (int j = 0; j < oneDimSize; j++) { bool breakSetForK = false; for (int k = 0; k < oneDimSize; k++) { bool breakSetForL = false; for (int l = 0; l < oneDimSize; l++) { if (ints[i, j, k, l] == 0) { breakSetForL = true; break; } } if (breakSetForL) { breakSetForK = true; break; } } if (breakSetForK) { breakSetForJ = true; break; } } if (breakSetForJ) { breakSetForI = true; break; } }
Tutaj już duplikujemy instrukcje if i musimy skorzystać z 4 zmiennych. To samo za pomocą goto wygląda następująco:
int oneDimSize = 2; int[, , ,] ints = new int[oneDimSize, oneDimSize, oneDimSize, oneDimSize]; bool breakSet = false; for (int i = 0; i < oneDimSize; i++) { for (int j = 0; j < oneDimSize; j++) { for (int k = 0; k < oneDimSize; k++) { for (int l = 0; l < oneDimSize; l++) { if (ints[i, j, k, l] == 0) { goto LabelIsZero; } } } } } return; LabelIsZero: breakSet = true;
Kod z zastosowaniem goto jest zdecydowanie czytelniejszy. Gdybyś miał jakiś inny pomysł na dobre zastosowanie goto to daj znać.
Brak komentarzy:
Prześlij komentarz