C#8 – Novidades parte 3

No terceiro post da série sobre as novidades do C#8, irei mostrar uma mudança bem expressiva – o termo caiu bem – na estrutura Switch/case da linguagem.

Switch Expressions, como o próprio nome sugere, trás o uso de expressões para dentro do switch, os sinais “=>” – sem aspas- indicam que a seguir virá uma expressão, e não mais uma instrução.

As mudanças na estrutura switch compreendem:

  • Não há mais o uso da palavra case e : (dois pontos), eles foram substituídos por => ;
  • A variável a ser testada vem antes da expressão switch;
  • O corpo deixou de ser uma instrução e passou a ser uma expressão;
  • Não há mais a palavra default, esta foi substituída por um _ (underscore).
  • Break e return também deixaram de existir.

Na versão atual do C#, faríamos um switch/case da seguinte forma:

enum Operacao { Addition, Subtraction, Division, Multiplication }

        static int SolveOperation(int a, int b, Operacao operation)
        {
            var total = 0;

            switch (operation)
            {
                case Operacao.Addition:
                    total = a + b;
                    break;

                case Operacao.Subtraction:
                    total = Math.Abs(a - b);
                    break;

                case Operacao.Division:
                    total = a / b;
                    break;

                case Operacao.Multiplication:
                    total = a * b;
                    break;

                default:
                    total = 0;
                    break;
            }
            return total;
        }

É um código bem familiar para os desenvolvedores, algumas condições para executar determinada operação com base em uma enumeração e com o preenchimento do resultado na variável total – poderia simplesmente retornar com um “return” sem necessitar de variáveis, mas para deixar mais próximo do convencional, vamos dessa forma -.

Reescrevendo o mesmo código utilizando switch expressions ficaria da seguinte forma:

 enum Operacao { Addition, Subtraction, Division, Multiplication }

 static int SolveOperation(int a, int b, Operacao operation){
     
      var total = operation switch
         {
             Operacao.Addition => a + b,
             Operacao.Subtraction => Math.Abs(a - b),
             Operacao.Division => a / b,
             Operacao.Multiplication => a* b,
             _ => 0
         };
         return total;
      }

Com as mudanças feitas na estrutura switch, temos um código mais expressivo e menos verboso. A compreensão é mais leve e natural, claro, pode causar alguma impacto no início, mas isso desaparece logo de imediato.

No exemplo acima temos o retorno em apenas uma linha. Como poderíamos fazer se quiséssemos por exemplo inserir um tratamento de exceções na operação de divisão para evitar uma falha no caso de uma divisão por zero?

Nesse caso, resolveríamos utilizando as lambdas expressions dentro do corpo da expressão de retorno. Ficaria da seguinte forma:

enum Operacao { Addition, Subtraction, Division, Multiplication }

static int SolveOperation(int a, int b, Operacao operation){            

        total = operation switch
            {
                Operacao.Addition => a + b,
                Operacao.Subtraction => Math.Abs(a - b),
                Operacao.Division => ((Func<int>)(() =>
                {
                    try
                    {
                        return a / b;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }))(),
                Operacao.Multiplication => a * b,
                _ => 0
            };
            return total;
}

Note que toda a operação a partir do início da lambda “(()=>” – sem aspas- é convertida para um tipo Func<T>, que é um tipo nativo do .NET muito utilizado em delegates. Esse tipo possui retorno, no caso um int. Nesse caso não poderíamos por exemplo converter para um tipo Action<T> onde apenas há a execução de uma ação sem retornar nada.

Os códigos de exemplo podem ser baixados aqui.

Referências:

https://alexatnet.com/

https://docs.microsoft.com/pt-br/dotnet/

Até a próxima!

3 Replies to “C#8 – Novidades parte 3”

  1. Vou começar a utilizar agora mesmo!

    Sabe dizer se esta nova syntax já está incorporada nos “quick actions” do Visual Studio?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s