C# - Usando delegates (revisitado)

 Neste artigo voltamos ao assunto delegates para mostrar a aplicação do conceito de delegates em operações matemáticas.

Um delegate é um elemento da linguagem C# que permite que você faça referência a um método.

Nota:  Um delegate é similiar ao conceito de ponteiros para funções usados nas linguagens C e C++

Então um delegate em C#, é semelhante a um ponteiro de função (a vantagem é que é um ponteiro seguro). Usando um delegate você pode encapsular a referência a um método dentro de um objeto de delegação.

O objeto de delegação pode ser passado para o código o qual pode chamar o método referenciado sem ter que saber em tempo de compilação qual método será chamado.

Ora bolas...porque eu preciso de uma referência para um método ???

Quer uma resposta curta e grossa ???

R: Usando delegates você tem a flexibilidade para implementar qualquer funcionalidade em tempo de execução..

Vamos a seguir mostrar exemplos práticos da utilização de delegates em operações matemáticas.

O projeto usado como exemplo neste artigo foi criado no VS 2019 Community como um projeto .NET Core do tipo Console chamado : CShp_Delegates

1- Chamando operações matemáticas usando Delegates

Neste exemplo vamos usar os Delegates para encapsular funções em objetos de função que podem ser chamados, da mesma forma que é feita nas linguagens C e C++.

Como os ponteiros de função, os delegates permitem separar uma referência de função de sua implementação, permitindo que a implementação exista em um módulo separado.

Este programa possui uma classe chamada OperacoesMatematicas

namespace CShp_Delegates
{
    public class OperacoesMatematicas
    {
        public static double Multiplicar(double valor)
        {
            return valor * 2;
        }
        public static double ElevarAoQuadrado(double valor)
        {
            return valor * valor;
        }
    }
}

A seguir na classe Program definimos o

using static System.Console;
namespace CShp_Delegates
{
    class Program
    {
        delegate double MinhasOperacoes(double x);
        static void Main(string[] args)
        {
            MinhasOperacoes[] operacoes =
            {
               OperacoesMatematicas.Multiplicar,
               OperacoesMatematicas.ElevarAoQuadrado
            };
            for (int i = 0; i < operacoes.Length; i++)
            {
                WriteLine($"Operacao[{i}]:");
                ExibirResultado(operacoes[i], 5.36);
                ExibirResultado(operacoes[i], 13.75);
                ExibirResultado(operacoes[i], 1.732);
                WriteLine();
            }
            ReadLine();
        }
        static void ExibirResultado(MinhasOperacoes acao, double valor)
        {
            double resultado = acao(valor);
            WriteLine($"Valor : {valor}  Resultado : {resultado}");
        }
    }
}

Neste código estamos chamando as operações matemáticas usando delegates.

Um delegate é uma variável de tipo de referência(MinhasOperacoes) que contém a referência a um método sendo que a referência pode ser alterada em tempo de execução, e, fazemos isso usando um laço para executar funções diferentes, chamando a função usando a variável de objeto delegate.

Aqui, os Delegates são usados para encapsular funções em objetos de função que podem ser chamados e usados  como ponteiros de função. Como os ponteiros de função, os delegates permitem separar uma referência de função de sua implementação, permitindo que a implementação exista em um módulo separado.

O resultado da execução do projeto pode ser vista abaixo:

2- Convertendo de pés para polegadas e de polegadas para centímetros

Usando a mesma abordagem podemos criar um projeto para converter os valores de pés para polegadas e de polegadas para centimetros.

Para isso vamos criar uma nova classe chamada ConversorMedidas onde vamos realizar as conversões :

namespace CShp_Delegates
{
    public class ConversorMedidas
    {
        public static double PolegadasParaCentimetros(double polegadas)
        {
            return polegadas / 0.39370;
        }
        public static double PesParaPolegadas(double pes)
        {
            return pes * 12;
        }
    }
}

A seguir no arquivo Program definimos as instâncias dos delegates apontando para os métodos definidos na classe acima e depois realizamos as conversões :

A seguir vemos o resultado obtido:

Percebeu a flexibilidade dos delegates e as possibilidades de usar esse recurso no seu código ?

Pegue o código completo aqui:   CShp_Delegates.zip

"Então, aproximando-se dele um escriba, disse-lhe: Mestre, seguir-te-ei para onde quer que fores.
Mas Jesus lhe respondeu: As raposas têm seus covis, e as aves do céu, ninhos; mas o Filho do Homem não tem onde reclinar a cabeça."
Mateus 8:19,20

 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?


Referências:


José Carlos Macoratti