Usando “Return” sobre “Break” ou uma combinação

4

Ao usar a declaração Switch , está usando return em vez de break ou uma combinação das duas formas consideradas ruins?

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;
    }
}
    
por tyh 29.01.2015 / 00:00
fonte

3 respostas

12

A instrução break é necessária no caso 1 e no caso 3. Se você a omitir, o código não será compilado, porque o if body não tem garantia de execução e o fall-through em switch instruções é não permitido em c #.

A instrução break não é necessária no caso 0 e no caso 2, porque o return sempre é executado; a execução de código nunca alcançará a instrução break . O compilador emitirá um aviso se você incluir a instrução break , mas o código será compilado.

Não ter as declarações break pode ser útil para simplificar determinadas funções de mapeamento ou fábrica:

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

Se você precisar de um comportamento simples, poderá simulá-lo com um goto , um dos poucos lugares na linguagem C # em que usar um goto realmente faz sentido, embora seja discutível se isso constitui ou não um bom estilo .

    
por 29.01.2015 / 00:15
fonte
5

Eu evitaria usar várias instruções return em um método como esse pela simples razão de que você precisaria colocar um ponto de interrupção em cada instrução de retorno para ver qual valor é retornado (e por quê).

Seria melhor fazer algo como

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;
}

Para uma discussão sobre várias declarações return em uma função, consulte esta pergunta do StackOverflow .

    
por 30.01.2015 / 18:24
fonte
2

Geralmente, prefiro evitar misturar retornos e interrupções em instruções switch. Quando eu leio o código e vejo uma declaração de mudança grande, eu posso querer apenas dar uma rápida olhada para ter uma idéia do que está fazendo, então pule mentalmente para ler o resto da lógica no código. Se cada ramificação da instrução switch fizer a mesma coisa, isso é fácil de fazer, mas se algumas ramificações estão retornando e se a continuação continuar, isso se torna mais difícil de entender. Para esta situação, eu preferiria uma solução como a de Wai Ha Lee, porque é mais fácil entender o código rapidamente.

    
por 02.02.2015 / 20:13
fonte