msdn32_capa.jpg

 

Clique aqui para ler todos os artigos desta edição

 

 

 

C# 2.0 - Métodos anônimos

 

A versão 2.0 da linguagem de programação 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 segundo de uma série que tem como objetivo detalhar os novos recursos do C# 2.0. Nessa segunda parte, vamos conhecer um pouco sobre métodos anônimos.

 

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

 

O conceito de métodos anônimos está diretamente vinculado ao de delegates. Sendo assim, inicialmente, este artigo abordará delegates e, em seguida, será estendido para demonstrar o uso de métodos anônimos.

Em versões anteriores ao C# 2.0, um delegate somente poderia encapsular métodos nomeados. Quando você instancia um delegate usando um método nomeado, o método é passado como parâmetro. A criação de métodos anônimos é essencialmente uma maneira de passar um bloco de código para um parâmetro delegate.

Delegates

Um delegate é um tipo por referência usado para referenciar um método. Qualquer método que satisfaça a assinatura do delegate, que consiste do tipo de retorno e dos tipos dos parâmetros, pode ser atribuído a uma instância do mesmo.

Delegates são similares a ponteiros de função no C/C++, porém são Orientados a Objetos, tipos seguros.

 

Nota: Observe que a definição de assinatura de um delegate é diferente da assinatura de um método. A assinatura de um método consiste do nome do método e dos tipos dos parâmetros, sendo uma definição essencial para o conceito de sobrecarga de métodos.

 

Os delegates possibilitam mudanças nas chamadas de métodos programaticamente, permitindo “plugar” um novo código chamado de dentro de tipos existentes. A linguagem de programação C# utiliza delegates na declaração de eventos em um tipo.

Exemplo de uso de delegates

O exemplo a seguir possui uma implementação de um delegate e uma classe com um campo deste tipo. O exemplo é constituído por uma solução contendo dois projetos: um projeto Class Library (“RendimentoEscolar”) e outro projeto Console Application (“TesteRendimentoEscolar”), ambos em Visual C#. A Figura 1 apresenta o Solution Explorer do Visual Studio 2005.

 

image002.jpg

Figura 1. Exemplo de delegates no Visual Studio 2005

Projeto Class Library (RendimentoEscolar)

O projeto possui uma classe denominada Rendimento (arquivo Rendimento.cs), cujas instâncias podem ser usadas para armazenar informações sobre o rendimento de um aluno em quatro bimestres e permite o cálculo da média final. Por padrão, a média final será calculada pela média aritmética simples das notas obtidas pelo aluno nos quatro bimestres.

O delegate, nomeado CalcularMedia (arquivo CalcularMedia.cs), tem como objetivo permitir a introdução de uma nova rotina de cálculo da média final, dando a flexibilidade para o desenvolvedor criar uma rotina fora da definição da classe.

A Figura 2 apresenta o diagrama da classe Rendimento.

 

image004.jpg

Figura 2. Diagrama da classe Rendimento

Os campos privados aluno, materia, matricula, nota1b, nota2b, nota3b e nota4b armazenam informações do aluno, da matéria e das notas nos bimestres. Os campos podem ser acessados por propriedades públicas de leitura e escrita.

O campo privado calcularMediaFinal, que é do tipo CalcularMedia (delegate), pode ser acessado indiretamente pela propriedade CalcularMediaFinal para permitir referenciar um outro método para cálculo da média final. A Listagem 1 apresenta a definição do delegate CalcularMedia (crie uma nova classe para inserir o código da Listagem).

 

Listagem 1. Definição do delegate CalcularMedia

namespace MsdnMagazine.CSharp2.MetodosAnonimos

{

   public delegate

   decimal CalcularMedia(decimal notab1,

     decimal notab2, decimal notab3,

     decimal notab4);

}

 

A Listagem 2 mostra a definição da classe Rendimento.

 

Listagem 2. Definição da classe Rendimento

namespace MsdnMagazine.CSharp2.MetodosAnonimos

...

Quer ler esse conteúdo completo? Tenha acesso completo