msdn33_capa.jpg

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.

 

image002.jpg

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; ...

Quer ler esse conteúdo completo? Tenha acesso completo