Hoje vou abordar o novo recurso Pattern Matching introduzido na versão 7.0 da linguagem C#. |
Esse recurso pode ser visto como uma extensão do operador is que já existe desde a primeira versão do C# e que é usado para verificar um tipo de um objeto em tempo de execução.
O recurso Pattern Matching adiciona mais poder ao operador is e a cláusula switch permitindo atribuir o resultado a uma variável após realizar a verificação de tipo. (Antes era comum ter que usar um 'cast' para fazer a atribuição)
Vamos ver como isso funciona usando a expressão Is.
Antes do C# 7.0, o operador Is era usado para verificar o tipo de uma variável e, com base no tipo, retornar true ou false, mas com o C# 7.0, a expressão Is fornece 3 tipos de correspondência de padrões :
1 - Padrão Const
static void ExpressaoIs_Const() { object objNull = null; object objNumero = 99; string objNome = "Macoratti"; // verifica null
if (objNull is null)
Console.WriteLine("ObjNull é null");
// Verifica valor constante
if (objNumero is 99)
Console.WriteLine("ObjNumero tem o valor igual a 99");
// verifica valor string
if (objNome is "Macoratti")
Console.WriteLine("O ObjNome é igual a : \"Macoratti\"");
Console.ReadLine();
}
|
Note que podemos verificar qualquer valor incluindo o null.
2 - Padrão Type
Agora podemos confirmar o tipo do objeto e também atribuir o valor a uma nova variável do tipo dado.
Antes do C# 7.0, também tínhamos o recurso semelhante, mas era precisa dar um cast.
No código abaixo temos duas classes Pessoa e Funcionario onde Funcionario herda de Pessoa:
internal class Pessoa { public Pessoa() {} public string Nome { get; set; }
public string Email { get; set; }
}
internal class Funcionario : Pessoa
{
public Funcionario(){}
public string Setor { get; set; }
}
static void EspressaoIs_Type()
{
Object obj = 2;
var objPessoa = new Pessoa() { Nome = "Macoratti", Email = "mac@yahoo.com" };
var objNewPessoa = new Funcionario() { Nome = "Jefferson", Setor = "Engenharia" };
if (obj is int i)
Console.WriteLine($" Variavel i possui o valor de {i}");
if (objPessoa is Pessoa pessoa)
Console.WriteLine($" p é do tipo {pessoa.GetType().Name} e o nome é {pessoa.Nome}");
if (objNewPessoa is Funcionario newPessoa)
Console.WriteLine($" p é do tipo {newPessoa.GetType().Name} e o setor é {newPessoa.Setor}");
if (objNewPessoa is Pessoa objPess)
Console.WriteLine($" p é do tipo {objPess.GetType().Name} e o nome é {objPess.Nome}");
Console.ReadLine();
}
|
Abaixo temos o resultado da execução deste código:
Como Funcionario herda de Pessoa , na última instrução temos um objeto real de Funcionario mas ele é atribuído a uma variável do tipo base. (Pessoa)
3 - Padrão Var
Este é um padrão de caso especial onde verificamos o tipo como var. Isso possui uma diferença com o padrão de tipo, uma vez que retorna true mesmo que seja nulo.
internal class Pessoa
{
public Pessoa(){ }
public string Nome { get; set; }
public string Email { get; set; }
}
static void ExpressaoIs_Var()
{
object obj = new Pessoa() { Nome = "Macoratti", Email = "mac@yahoo.com" };
if (obj is var p)
{
Console.WriteLine($"Padrão Var : P é do tipo {p?.GetType().Name}.");
}
obj = null;
if (obj is var pess)
{
Console.WriteLine($"Padrão Var : P é do tipo {pess?.GetType().Name}.");
}
Console.ReadLine();
}
|
Abaixo vemos o resultado da execução do código acima:
Note que agora podemos ver que a segunda verificação também é verdadeira, mas como ela é nula, nada é exibido onde escrevemos o nome do tipo.
Na próxima parte do artigo veremos o funcionamento do Pattern Matching com a instrução switch.
Pegue o projeto completo aqui : C7_PatternMatching.zip
"Meus
filhinhos, estas coisas vos escrevo, para que não pequeis; e, se alguém
pecar, temos um Advogado para com o Pai, Jesus Cristo, o justo."
1 João 2:1
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Visual Studio - Dica de produtividade - Quick Launch - Macoratti.net
Visual Studio - Dica de produtividade - Nuget - Macoratti.net
VB .NET - Trabalhando com numéros Complexos - Macoratti
C# - Float, Double e Decimal. Afinal qual devo usar - Macoratti
C# - Os doze trabalho de Hércules - 12 Desafios ... - Macoratti.net
C# - Novidades da versão 7.0 - Macoratti
C# - O tipo Dynamic - Macoratti.net
C# - Entendendo as palavras chaves 'is' e 'as' - Macoratti
C# - Apresentando o delegate Func - Macoratti.net
C# - Reflection e o Late Binding - Macoratti
C# - Como funciona a palavra chave var - Macoratti.net