C# - Usando Generics na prática


  Hoje veremos como usar Generics na prática em um projeto para criar uma calculadora Genérica.

Para conhecer os conceitos sobre Generics veja esses dois artigos que eu já publiquei:

Hoje vamos usar os conceitos de Generics para criar uma calculadora. 

A implementação da Generics na plataforma .NET tem como objetivo principal tornar as operações com coleções tipadas seguras, rápidas e fáceis de usar.

Agora realizar cálculos com tipos genéricos não é uma tarefa tão simples como parece.

Como vamos criar um programa para realizar cálculos, vamos pensar na operação de adição de dois números.  Se você pensa que pode simplesmente definir um método e declarar a soma de dois tipos declarados como genéricos da seguinte forma:

T Adicionar<T>(T a, T b)
{
     return a+b;
}

Vai obter a seguinte mensagem de erro

Mas por que isso acontece ?

Generics em C# são implementados em tempo de execução e são verificados em tempo de compilação, e, nem todos os objetos suportam a operação de adição. (Object não define uma operação de adição)

Logo, como T pode ser qualquer tipo, em tempo de execução, o compilador simplesmente não pode determinar o que significa a+b quando o tipo de a e de b ainda não foram determinados.

Nota: Para conferir as restrições suportadas por Generics veja o link: https://goo.gl/PhwpU4

Podemos pensar que para restringir os parâmetros de Tipo podemos definir uma interface que o Tipo tem que implementar. O problema com essa abordagem é que as interfaces não podem conter métodos estáticos e os métodos do operador tem que ser estáticos.

Na verdade podemos usar uma interface mas teremos que usar o tipo estático dynamic introduzido na versão 4.0 do C#.

Implementando a calculadora Genérica com dynamic

Crie um projeto do tipo Console no VS 2017 Community e defina a seguinte interface no projeto:

A seguir crie a classe Calculadora que implementa esta interface :



Neste código para evitar o erro com os operadores usamos o tipo dynamic que vai criar uma árvore de expressão que será resolvida em tempo de execução.

A seguir vemos o código que usa a classe Calculadora() e define um tipo realizando as operações:

O resultado é exibido abaixo:

Nossa calculadora Genérica esta funcionando, mas...

Sacrificamos a verificação de tipo em tempo de compilação usando dynamics e isso tem um custo em termos de segurança e desempenho.

Na próxima parte do artigo veremos um abordagem mais correta para criar a nosssa calculadora Genérica.

Pegue o projeto aqui :  CShp_GenericCalc.zip

"Falou-lhes, pois, Jesus outra vez, dizendo: Eu sou a luz do mundo; quem me segue não andará em trevas, mas terá a luz da vida."
João 8:12

Referências:


José Carlos Macoratti