Delegates

by Fabiano 19. abril 2008 00:25

Olá pessoal,  em nossas aulas sempre damos dicas para nossos alunos, seja mostrando boas praticas ou novidades ou até mesmo funcionalidades mais antigas, mais que facilitam e deixam o nosso codigo sempre mais inteligente e intuitivo. Eu estava falando sobre delegates, foi na aula em que falava de Querys LINQ utilizando Lambda Expression,  e percebi que muitos alunos não conheciam muito sobre delegates e por isso tambem não utilizavam em seus projetos. Por isso resolvi falar um pouco mais sobre o assunto aqui em nosso BLOG. 

Os delegates estão presentes no .NET desde sua versão beta. Qual sua função? E permitir que utilizemos metodos de uma outra classe em nosso contexto atual, da mesma maneira que existe os ponteiros para objetos em C++  o delegate pode ser utilizado como referência para uma ou mais funções em C# e ser invocado quando necessário. 

Quando criamos um delegate precisamos de um nome e da declaração dos parametros necessários de entrada ou de saida. Os delegates não são construções simples como struct etc, são uma classe, pois qualquer delegate declarado é herdado da classe base System.Delegate do .NET 

Na verdade um delegate pode ser herdado de duas classes distintas System.Delegate ou System.MulticastDelegate, se o delegate tiver um tipo de retorno “void” ele é automaticamente um System.MulticastDelegate, assim ele suporta inúmeras funções com um operador “+=”.Se o delegate tiver um tipo de retorno não “void” ele é um System.Delegate e não suporta multiplos métodos como o caso anterior. 

Falando em termos menos tecnicos, quando você declara uma variável do tipo do delegate, essa varíavel vai receber (quando for instanciada) um endereço de uma função, que deve ter a mesma assinatura do delegate. É uma especie de ponteiro. 

Mãos a obra: 

Como Criamos um Delegate: 

Podemos criar delegates de duas formas como dito acima, com retorno ou sem retorno. Vejamos: 

public delegate int valor(int VL1, int VL2);
e
delegate void PopulaResultado(int Vl1, int Vl2);

Podemos utilizar um exemplo bem simples para demostrar sua utilização.

class Exemplo
{

        static void Main(string[] args)
        {
            Exemplo prog = new Exemplo();
            MeuMetodoDelegate MeuEx1 = new MeuMetodoDelegate(prog.ePossitivo);
            MeuMetodoDelegate MeuEx2 = new MeuMetodoDelegate(ePossitivoSimbolo);
            Console.WriteLine("{0} is {1}; use the sign \"{2}\".", 5, MeuEx1(5), MeuEx2(5));
            Console.WriteLine("{0} is {1}; use the sign \"{2}\".", -3, MeuEx1(-3), MeuEx2(-3));
            Console.WriteLine("{0} is {1}; use the sign \"{2}\".", 0, MeuEx1(0), MeuEx2(0));
         }

        public delegate String MeuMetodoDelegate(int myInt);

        public String ePossitivo(int myInt)
        {
            if (myInt > 0)
                return ("Sim");
            if (myInt < 0)
                return ("Não");
            return ("Zerado");
        }

        public static String ePossitivoSimbolo(int myInt)
        {
            if (myInt > 0)
                return ("+");
            if (myInt < 0)
                return ("-");
            return ("");
        }
    }
  

Observer que criamos um unico delegate MeuMetodoDelegate que recebe um inteiro como parametro e retorna uma String para chamarmos um precisamos da estância da classe e para chamarmos o método statico não precisamos da estância. Podemos ainda fazer chamadas assíncronas de metedos utilizando o delegate para isso temos que criar o delegate com a mesma assinatura de uma método de fazer a chamada via BeginInvoke. Vejamos um exemplo: Lembrando que neste caso o método não precisa ser statico

MeuMetodoDelegate MeuEx2 = new MeuMetodoDelegate(this.ePossitivoSimbolo);
MeuEx2.BeginInvoke(3, null, null); 

Desta maneira você poderá fazer chamadas assíncronas dos seus metodos dentro de sua aplicação, mais um beneficio da utilização de delegates em sua aplicação. Estes é so um pequeno exemplo de como os delegates podem ser uteis em seu dia a dia.

Bons Códigos...

Tags:

.Net

Boa prática de AJAX

by Fabiano 9. abril 2008 00:22

 

 

O Microsoft AJAX Framework oferece muitos, muitos, muitos e muitos recursos interessantes. Porém é necessário tomar alguns cuidados para evitar a má utilização destes recursos em funcionalidades desnecessárias.

Um exemplo simples: um formulário com 1 botão e label e quando clicamos no botão, alteramos a propriedade texto do label para DateTime.Now.ToStiong() e com isso exibimos a hora atual.

Procedimento padrão de ajax: colocar um Script Manager e um UpdatePanel… arrasta os controles para o UpdatePanel e pronto!!!! AJAX implementado… 

Claro que isso é o suficiente para dar a impressão que estamos melhorando muito a performance de nossa página, porém podemos melhorar muito mais.

O botão está dentro do Update Panel de forma desnecessária, isso porque ele simplesmente faz o evento click para alterar o valor do Label, ou seja, somente o Label precisa ser enviado para o servidor.

Solução:

  • Tirar o botão do Update Panel
  • Adicionar uma trigger para o botão dentro do Update Panel 

Veja o código:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="Button1" />
        </Triggers>
        <ContentTemplate>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
           
        </ContentTemplate>
    </asp:UpdatePanel>

Com isso diminuímos o tráfego de dados entre applicação e servidor! em um cenário maior, isso pode mudar muito a performance de sua aplicação.

Conclusão: não utilize o Update Panel em toda a página, é preferível colocar mais do que um Update Panel na página do que colocar em lugares desnecessários. 

 

 

Bons Códigos...

 

Tags: , ,

.Net

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

Fabiano Belmonte

Senior Architect, especialista em aplicações e-business com larga experiência em B2B (Submarino. Com e Saraiva.Com). Trabalha há 5 anos com a tecnologia .Net, aplicando conhecimentos nas diversas áreas: instituições financeiras (sistema SPB), e-commerce, gerenciamento logístico entre outras.