wtorek, 19 czerwca 2012

Czy goto ma zastosowanie w c#

Goto to zło. Ale w niektórych sytuacjach przydaje się.



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