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