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