
Clique aqui para ler todos os artigos desta edição
C# 2.0 - Iterators
Rogério Moraes de Carvalho
Nota: Para um bom entendimento das técnicas demonstradas nesta série sobre os novos recursos do C# 2.0, é ideal que o leitor tenha pelo menos um conhecimento básico da linguagem C#.
No .NET 1.0 e 1.1 (1.x), um tipo T é denominado tipo de coleção se implementa a interface System.Collections.IEnumerable ou implementa o padrão de coleção, conforme descrito nos critérios a seguir:
· O tipo T contém um método público de instância nomeado GetEnumerator que retorna um tipo E de estrutura, de classe ou de interface que satisfaça as condições seguintes;
· O tipo E contém um método público de instância nomeado MoveNext que retorna um valor booleano (tipo bool). Esse método tem como função retornar o próximo elemento da coleção, retornando true caso ele exista ou false caso não;
· O tipo E contém uma propriedade pública de instância nomeada Current que permite a leitura do valor atual da coleção.
A versão 2.0 da linguagem C# disponibiliza o novo recurso de iterators, que fornecem um meio simples de implementar um membro de função cujo tipo de retorno seja da interface de enumerador (System.Collections.IEnumerator), da interface genérica de enumerador (System.Collections.Generic.IEnumerator
Os tipos de coleção podem ser utilizados em instruções foreach do C#.
Motivação para o uso de Iterators
Antes de incluir o recurso de iterators na linguagem C# 2.0, sempre que o desenvolvedor quisesse criar um tipo de coleção teria que implementar a interface System.Collections.IEnumerable ou o padrão de coleção. Muitas vezes, esse é um processo relativamente trabalhoso.
Exemplo de uma motivação para o uso de Iterators
O exemplo a seguir cria uma agenda de contatos e permite que ela seja consultada de vários modos. A solução será composta por um projeto Class Library e um projeto Console Application para testar os tipos desenvolvidos na biblioteca de classes. Inicialmente não será utilizado o novo recurso de Generics com o propósito de demonstrar como era desenvolvido um tipo de coleção com uma versão anterior à linguagem C# 2.0.
Projeto Class Library (“AgendaContatos”)
Crie uma solução em branco com o nome de “DemoAgendaContatos”. Então, crie um projeto Class Library com o nome de “AgendaContatos” e adicione-o à solução (Add to Solution, na opção Solution da janela New Project). O projeto AgendaContatos será composto por:
· enumeração TipoTelefone com os tipos possíveis de telefone de um contato;
· estrutura Telefone com os dados de um telefone de um contato;
· enumeração TipoContato com os tipos de contato possíveis;
· classe Contato para armazenamento dos dados de um contato;
· classe do tipo de coleção denominada Agenda para agregar um conjunto de contatos.
O código a seguir apresenta a definição da enumeração TipoTelefone (arquivo TipoTelefone.cs).
namespace MsdnMagazine.AgendaContatos{
public enum TipoTelefone {
Residencial, Trabalho, Celular
}
}
A Listagem 1 apresenta a definição da estrutura Telefone (arquivo Telefone.cs).
Listagem 1. Definição da estrutura Telefone
namespace MsdnMagazine.AgendaContatos{
public struct Telefone{
private TipoTelefone tipo;
private string ddd;
private string telefoneLocal;
public Telefone(TipoTelefone tipo, string ddd,
string telefoneLocal) {
this.tipo = tipo;
this.ddd = ddd;
this.telefoneLocal = telefoneLocal;
}
public TipoTelefone Tipo {
get { return tipo; }
set { tipo = value; }
}
public string Ddd {
...