Clique aqui para ler todos os artigos desta edição
C# 2.0 - Generics
Por Rogério Moraes de Carvalho
A versão 2.0 do C# introduziu uma série de extensões, como: tipos parciais, classes estáticas, métodos anônimos, tipos e métodos genéricos (Generics), iterators e tipos anuláveis. Este artigo é o terceiro de uma série que tem por objetivo, detalhar os novos recursos do C# 2.0. Vamos conhecer um pouco sobre Generics.
Nota: Para um bom entendimento das técnicas demonstradas nessa série sobre os novos recursos do C# 2.0, é ideal que o leitor tenha pelo menos um conhecimento básico da linguagem C#.
A versão 2.0 permite que tipos e métodos sejam parametrizados pelos tipos de dados que eles armazenam e/ou manipulam, sendo que esse recurso é denominado Generics. O conceito de Generics da linguagem C# 2.0 é similar ao conceito de Generics da linguagem Java 5.0 (Tiger), com algumas diferenças na abordagem e na implementação. Os desenvolvedores C++ com experiência em templates também poderão notar algumas similaridades.
O recurso de Generics é mais amplamente usado com coleções. A biblioteca de classes do .NET Framework 2.0 fornece um novo namespace, chamado System.Collections.Generic, com novas classes de coleções genéricas de uso geral.
Motivação para o uso de Generics
Antes de incluir o recurso de Generics na linguagem C# 2.0, sempre que o desenvolvedor quisesse armazenar dados de qualquer tipo em variáveis, então deveria declará-las como sendo do tipo Object (System.Object).
Com o objetivo de ilustrar as penalidades envolvidas no uso de variáveis do tipo Object para armazenar dados genéricos, seguem a descrição e a implementação de um exemplo com uso de uma classe de coleção do namespace System.Collections.
Exemplo de uma motivação para o uso de Generics
O exemplo a seguir, permite a entrada das notas dos alunos de uma turma numa dada avaliação. Após a entrada dos dados, todas as notas são apresentadas na tela, juntamente com a média aritmética simples, a nota mínima e a nota máxima dos alunos.
Uma vez que o número de alunos de uma turma não é fixo, os dados não serão armazenados em um Array. O namespace System.Collections contém interfaces e classes que definem vários tipos de coleções de objetos com tamanhos variáveis, estando disponível desde a primeira versão (1.0) do .NET Framework.
Neste exemplo, uma instância da classe ArrayList será utilizada para armazenar as notas dos alunos. Internamente, a classe ArrayList utiliza um Array para armazenar os dados, sendo que ele é redimensionado dinamicamente sempre que necessário.
Com o objetivo de simplificar ao máximo o exemplo, ele será constituído por uma solução contendo um único projeto Console Application (“RendimentoTurma”), em Visual C#.
Projeto RendimentoTurma
O projeto possui uma classe denominada Rendimento (arquivo Rendimento.cs). A Figura 1 apresenta o diagrama da classe Rendimento.
Figura 1. Diagrama da classe Rendimento
O campo privado notas, do tipo System.Collections.ArrayList, é usado para armazenar as notas dos alunos da turma. O método privado coletarNotas é utilizado para solicitar a entrada das notas dos alunos da turma para o usuário. As notas são coletadas até o usuário pressionar a tecla ENTER sem entrar um valor para nota.
O método privado apresentarRendimento mostra todas as notas, média, mínima e máxima dos alunos da turma. O método Main é o ponto de entrada do programa. Inicialmente, a classe Rendimento é instanciada e, posteriormente, são chamados os métodos de instância coletarNotas e apresentarRendimento, respectivamente. A Listagem 1 apresenta a definição da classe Rendimento.
Listagem 1. Definição da classe Rendimento
using System;
using System.Collections;
namespace RendimentoTurma
{
public class Rendimento
{
private ArrayList notas;