C# 7.0 - Entendendo Pattern Matching  - II


 Hoje vou abordar o novo recurso Pattern  Matching introduzido na versão 7.0 da linguagem C#.

Continuando a primeira parte do artigo veremos agora como o novo recurso Pattern Matching funciona com a instrução switch.

O pattern matching pode ser aplicado em instruções switch de maneira que :

  • Podemos usar switch com qualquer tipo (não apenas com tipos primitivos)
  • Os patterns podem ser usados em cláusulas case;
  • As cláusulas case podem usar condições adicionais;

Sua aplicação torna-se particularmente muito útil quando o número de condições de teste aumenta e o uso do padrão Is se torna difícil de manter.

Anteriormente instrução switch suportava apenas um padrão constante com tipos e cadeias de valores limitados, mas agora também podemos usar os padrões Type e Var.

Vejamos um exemplo:

No código abaixo temo :

  • Uma classe Forma
  • Uma classe Triangulo que herda de Forma e calcula o perímetro do triãngulo no método Perimetro()
  • Uma classe Retangulo que herda de Forma e calcula a área do retângula no método Area()
    public class Forma
    {}
    public class Triangulo : Forma
    {
        public int Largura { get; set; }
        public int Altura { get; set; }
        public int Base { get; set; }
        public Triangulo(int _largura, int _altura, int _base)
        {
            this.Largura = _largura;
            this.Altura = _altura;
            this.Base = _base;
        }
        public void Perimetro()
        {
            Console.WriteLine($"O perímetro do triângulo é {Largura + Altura + Base}");
        }
     }
     public class Retangulo : Forma
     {
            public int Largura { get; set; }
            public int Altura { get; set; }
            public Retangulo(int largura, int altura)
            {
                this.Largura = largura;
                this.Altura = altura;
            }
            public void Area()
            {
                Console.WriteLine($"A área do retângulo é {Largura * Altura}");
            }
     }
 

No código abaixo vamos criar um array de formas contendo um triângulo e dois retângulos e a seguir vamos usar o operador switch e o operador Is aplicando o pattern matching:

   class Program
    {
        static void Main(string[] args)
        {
            Forma[] formas = { new Triangulo(5, 6, 5), new Retangulo(6, 3), new Retangulo(11,7) };
            foreach (var item in formas)
            {
                switch (item)
                {
                     case null:
                        Console.WriteLine("Item é nulo");
                        break;
                    case Triangulo t:
                        t.Perimetro();
                        break;
                    case Retangulo r when r.Largura > 0:
                        r.Area();
                        break;
                    case Retangulo r:
                        r.Area();
                        break;
                 }
            }
            Console.ReadLine();
        }
    }

Abaixo temos o resultado da execução deste código:

Vemos que o pattern matching adiciona mais poder tanto aos operadores switch e is.

No caso da instrução switch agora podemos comparar o tipo de um objeto dentro de um bloco switch.

Assim, agora não é mais necessário realizar o cast do objeto dentro do condicional. Este cenário também nos permite uma verificação mais detalhada, onde podemos fazer verificações adicionais, note que no segundo case, verificamos se o objeto é um retângulo, e checamos em seguida se sua largura é maior que zero.

Nota: Agora fique atento para fato de que a ordem dos case é muito importante.

Observe que podemos também usar constantes, como no primeiro case  onde foi usado o null,  para evitar exceções de null reference nos cases seguintes.

Podemos concluir dizendo que o processo de verificação de tipo e o cast de objetos ficou mais simples. Portanto se você esta usando o C# 7.0 não hesite em utilizar este recurso no seu código.

Pegue o projeto completo aqui :  C7_PatternMatching2.zip

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti