C# 8.0  -  A instrução switch


Hoje vou apresentar com mais detalhes a instrução switch na versão 8.0 da linguagem C#.

Temos muitas novidades na versão 8.0 da linguagem C# e eu já apresentei um resumo das principais neste artigo: C# 8.0 - As novidades da nova versão

Para poder usar os novos recursos basta instalar a última versão do Visual Studio Community 2019 e criar um projeto do tipo Console Application para .NET Core:

Vamos iniciar com um código bem simples usando a nova instrução switch:

Dando uma espiada no código acima, se você já esta familiarizado com a instrução switch, já pode entender o que o código vai fazer.

O que chama a atenção é a ausência das palavras-chave case e break (ou return).

Na nova versão eles não são necessárias para alternar expressões. O que é menos óbvio é que o que segue a seta (=>) é uma expressão.

E como definir um valor padrão (default) na nova versão ?

Desde a versão  7, os switch cases podem usar a correspondência de padrões; portanto, em vez de usar a palavra-chave "default", o padrão de correspondência total pode ser usado. Assim basta usar o sinal "_" (sublinhado).

Assim poderíamos alterar o código conforme abaixo:

   

Os padrões são combinados um a um de cima para baixo, portanto, não é uma boa idéia colocar o valor padrão acima de qualquer outra correspondência. 

Na verdade, o compilador C#  alerta sobre isso. Se você tentou fazer isso, provavelmente receberá o seguinte erro: The pattern has already handled by a previous arm of the switch expression



Todas as expressões das opções switch cases devem ser calculadas para o mesmo tipo (a menos que lançem uma exceção). Por exemplo, todas int, ou strings, etc., neste caso a instrução switch é semelhante ao operador ternário.

Mas como executar vários comandos na instrução ?

Uma solução, que talvez não seja a ideal , é usar lambdas.

Vamos supor que desejamos realizar as operações e fazer o log das mesmas.

Ainda podemos usar expressões para avaliação e atribuição de valores como mostrado a seguir:

Para concluir vejamos um exemplo completo usando a instrução switch

using static System.Console;
namespace CShp_Switch1
{
    class Program
    {
        static void Main(string[] args)
        {
            Calculadora c1 = new Calculadora(50, 10, "*");
            c1.Imprimir();
            Calculadora c2 = new Calculadora(50, 10, "+");
            c2.Imprimir();
            Calculadora c3 = new Calculadora(50, 10, "*");
            c3.Imprimir();
            ReadLine();
        }
    }
    public class Calculadora
    {
        public Calculadora(int a, int b, string operacao)
        {
            this.Numero1 = a;
            this.Numero2 = b;
            this.Operacao = operacao;
            this.Resultado = this.Operacao switch
            {
                "+" => this.Numero1 + this.Numero2,
                "-" => this.Numero1 - this.Numero2,
                "/" => this.Numero1 / this.Numero2,
                "*" => this.Numero1 * this.Numero2,
                _ => -1
            };
        }
        public int Numero1 { get; set; }
        public int Numero2 { get; set; }
        public string Operacao { get; set; }
        public int Resultado { get; set; }

        public void Imprimir()
        {
            WriteLine($"{this.Numero1} {this.Operacao} {this.Numero2} = {this.Resultado}");
        }
    }
}

Executando o projeto teremos:



Concluindo temos as seguintes melhorias na sintaxe da instrução switch:

Aguarde mais artigos sobre as novidades do C# 8.0.

"Porque Deus não nos destinou para a ira, mas para a aquisição da salvação, por nosso Senhor Jesus Cristo, Que morreu por nós, para que, quer vigiemos, quer durmamos, vivamos juntamente com ele."
1 Tessalonicenses 5:9,10

Referências:


José Carlos Macoratti