Utilizzo di "Return" su "Break" o una combinazione

4

Quando si utilizza l'istruzione Switch , si sta utilizzando return invece di break o una combinazione di due forme pessime considerate?

while (true)
{
    var operation = Randomness.Next(0, 3);
    switch (operation)
    {
        case 0:
            return result + number;
        case 1:
            if ((result - number) > 0)
            {
                return result - number;
            }
            break;
        case 2:
            return result * number;
        case 3:
            if ((result % number) == 0)
            {
                return result / number;
            }
            break;
    }
}
    
posta tyh 29.01.2015 - 00:00
fonte

3 risposte

12

L'istruzione break è richiesta nel caso 1 e nel caso 3. Se la ometti, il codice non verrà compilato, perché il corpo if non è garantito per l'esecuzione, e le istruzioni fall-through in switch sono non consentito in C #.

L'istruzione break non è richiesta nel caso 0 e nel caso 2, poiché il return viene sempre eseguito; l'esecuzione del codice non raggiungerà mai l'istruzione break . Il compilatore emetterà un avviso se includi l'istruzione break , ma il codice verrà compilato.

Non avere le istruzioni di break può essere utile per semplificare determinate funzioni di mapping o di fabbrica:

public string NumericString(int digit)
{
    switch (digit)
    {
        case 1: return "one";
        case 2: return "two";
        case 3: return "three";
        // ..etc.
    }
}

Se hai bisogno di un comportamento fall-through, puoi simularlo con un goto , uno dei pochi posti nel linguaggio C # in cui l'utilizzo di goto ha effettivamente senso, sebbene sia discutibile se questo costituisca o meno un buon stile .

    
risposta data 29.01.2015 - 00:15
fonte
5

Eviterei di usare più dichiarazioni return in un metodo come quello per il semplice motivo che dovresti mettere un breakpoint su ogni istruzione return per vedere quale valore viene restituito (e perché).

Sarebbe meglio fare qualcosa di simile

while (true)
{
    var operation = Randomness.Next(0, 3);
    double? valueToReturn = null;

    switch (operation)
    {
        case 0:
            valueToReturn = result + number;
            break;
        case 1:
            if ((result - number) > 0)
                valueToReturn = result - number;
            break;
        case 2:
            valueToReturn = result * number;
            break;
        case 3:
            if ((result % number) == 0)
                valueToReturn = result / number;
            break;
    }

    if ( valueToReturn.HasValue )
        return valueToReturn.Value;
}

Per una discussione sull'avere più istruzioni return in una funzione, vedi questa domanda StackOverflow .

    
risposta data 30.01.2015 - 18:24
fonte
2

In genere preferisco evitare di mescolare i ritorni e le interruzioni nelle istruzioni switch. Quando leggo il codice e vedo una grande istruzione di commutazione, potrei volerlo semplicemente scremare velocemente per avere un'idea di cosa sta facendo, quindi saltarlo mentalmente per leggere il resto della logica nel codice. Se ogni ramo dell'istruzione switch fa la stessa cosa, è facile farlo, ma se alcuni rami stanno tornando e vengono continuano, diventa più difficile da capire. Per questa situazione, preferirei una soluzione come quella di Wai Ha Lee perché è più facile capire il codice rapidamente.

    
risposta data 02.02.2015 - 20:13
fonte

Leggi altre domande sui tag