Delegates em VisualBasic .NET

zericpxt

Portugal@Home Member
Bom dia,


queria saber o que é um Delegate no Visual Basic, e além de para que serve, onde é que realmente é útil usar delegates.

Eu pesquisei no google e cheguei à conclusão que delegates são como que apontadores de funções em C. Mas para que servem tais apontadores?

Na minha empresa, também não me conseguem explicar bem... dizem que tem a ver com threads, ou seja, a chamar um delegate, ele executa esse processo numa thread separada, mas eu tenho algumas dúvidas se assim é. Há alguma relação entre delegates e threads?


Agradeço qualquer ajuda,

cumprimentos
 
Última edição:
Bom dia,


queria saber o que é um Delegate no Visual Basic, e além de para que serve, onde é que realmente é útil usar delegates.

Eu pesquisei no google e cheguei à conclusão que delegates são como que apontadores de funções em C. Mas para que servem tais apontadores?

Na minha empresa, também não me conseguem explicar bem... dizem que tem a ver com threads, ou seja, a chamar um delegate, ele executa esse processo numa thread separada, mas eu tenho algumas dúvidas se assim é. Há alguma relação entre delegates e threads?


Agradeço qualquer ajuda,

cumprimentos

Um delegate é um método de fazer chamadas de funções dinamicamente "Virtual Call"..
Este mecanismo torna-se muito ultil ao utilizar mecanismos Multi-Thread, evitam o crash..

Pequeno exemplo de como funciona:
C#
Código:
delegate void MeuDelegate(int x, int y);
MeuDelegate m_MeuDelegate = new MeuDelegate(Somar);

public int Somar(int x, int y)
{
    return x * y;
}

private void button1_Click(object sender, EventArgs e)
{
    int Total = 0;
    total = m_MeuDelegate.Invoke(10, 2);
    Interaction.MsgBox(total.ToString);
}

VB.NET

Código:
    Delegate Function MeuDelegate(ByVal x As Integer, ByVal y As Integer)
    Dim m_MeuDelegate As New MeuDelegate(AddressOf Somar)

    Function Somar(ByVal x As Integer, ByVal y As Integer) As Integer
        Return x * y
    End Function
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Total As Integer
        Total = m_MeuDelegate.Invoke(10, 2)
        MsgBox(Total.ToString)
    End Sub

Também é possível combinar Delegates, isto por vezes torna se muito util.. ou seja podemos criar um delegate que ao ser invocado pode "disparar" várias subs/functions em um so call ..

Compr.
 
Última edição:
Delegates são efectivamente "ponteiros" para funções. Um conceito muito simples de perceber onde usamos delegates sem por vezes termos noção disso, é no tratamento dos eventos. Imagina que tens uma aplicação Windows onde tens um simples botão. Nesse botão, queres que quando cliques nele, que se execute uma determinada acção.

Então o que fazes? No Visual Studio podes dar duplo-click nele de forma a que automáticamente seja criado o método Click e este seja associado ao botão. Para que esse método fique associado ao evento do Click, algures na definição dos forms estará algo:

Button1.OnClick += Button1_Click;

ou algo semelhante, que basicamente diz "o evento OnClick do Button1 vai ser tratado pelo método Button1_Click". Neste momento estás a criar um delegate, ou seja, estás a delegar tarefas pelos métodos.

Como é que os delegates e as threads se relacionam? Praticamente da mesma forma que os ponteiros para funções e as threads funcionam em C. Tipicamente crias threads que executam código de uma determinada função, para dizeres ao compilador qual a função que desejas que a thread execute, então irás estar a usar um delegate para o fazer.

A ideia base é mesmo que os delegates são uma espécie de ponteiros, com a excepção de que na realidade não são mesmo ponteiros, uma vez que em VB .NET (em managed code) não tens ponteiros.
 
Delegates são efectivamente "ponteiros" para funções. Um conceito muito simples de perceber onde usamos delegates sem por vezes termos noção disso, é no tratamento dos eventos. Imagina que tens uma aplicação Windows onde tens um simples botão. Nesse botão, queres que quando cliques nele, que se execute uma determinada acção.

Então o que fazes? No Visual Studio podes dar duplo-click nele de forma a que automáticamente seja criado o método Click e este seja associado ao botão. Para que esse método fique associado ao evento do Click, algures na definição dos forms estará algo:

Button1.OnClick += Button1_Click;

ou algo semelhante, que basicamente diz "o evento OnClick do Button1 vai ser tratado pelo método Button1_Click". Neste momento estás a criar um delegate, ou seja, estás a delegar tarefas pelos métodos.

Como é que os delegates e as threads se relacionam? Praticamente da mesma forma que os ponteiros para funções e as threads funcionam em C. Tipicamente crias threads que executam código de uma determinada função, para dizeres ao compilador qual a função que desejas que a thread execute, então irás estar a usar um delegate para o fazer.

A ideia base é mesmo que os delegates são uma espécie de ponteiros, com a excepção de que na realidade não são mesmo ponteiros, uma vez que em VB .NET (em managed code) não tens ponteiros.

Desculpa, mas acho que fazes alguma confusão..
Associar eventos aos objectos é totalmente diferente de associar delegates a Functions/Subs..

De uma linguagem facil de perceber.. um Delegate é um mecanismo que nos permite fazer chamadas de Subs/Functions dinamicamente.. chamados os tais potenteiros..
Correr multiplas Subs/Functions em um so call, isto no VB.NET em algumas situações é mesmo obrigatorio o uso para evitar o crash..

Por exemplo se tentar criar um servidor em VB.NET todos os call do principal envento (tipo o DataArrivel do VB6) tera de ser invocado por delegates.. porque senão crasha.. isto por o shocks do .NET utlizão sistemas de WorkBackGround para optimização, não qual funcionão com threads separados.. e a melhor forma de lidar com "threads" é com delegates..
Exemplo de um projecto que realizei:
Código:
MUDELO PUBLIC
Public Delegate Sub UsrConnectionRequest(ByRef oUser As clsUser)

NO INCIO DA CLASS
Private m_oConnectionRequest As UsrConnectionRequest

QUANDO A CLASS INCIALIZA
'Set delegate address 
m_oConnectionRequest = New UsrConnectionRequest(AddressOf g_colUsers.UserConnectionRequest)

DENTRO DO EVENTO PARA A LEITURA DOS TCP CLIENTS
Todas as conxões passam por aqui, antes de estagbelecer conexão activa no servidor
If objSocket IsNot Nothing Then
    SyncLock objSocket
        'Get the IP address
        strIP = TryCast(CType(objSocket.RemoteEndPoint, IPEndPoint).Address.ToString, String)
        If Not String.IsNullOrEmpty(strIP) Then
            'Run the PreConnectionRequest event
            If g_objEvents.PreConnectionRequest(strIP) = False Then
                'Create user object
                objUser = New clsUser(objSocket)
                'Set empty name
                objUser.Name = NO_NAME
                '----> A CHAMADA VIRTUAL ATRAVEZ DO DELEGATE <---------
                m_oConnectionRequest.Invoke(objUser)
                'Start login sequene
                objUser.SendData("$Lock " & vbLock & "|$HubName " & g_objSettings.HubName & "|")
                'Add to collection
                m_colUsers.Add(objSocket, objUser.ID)
            End If
        End If
    End SyncLock
End If

Compr.
 
fLaSh_CF,

Seria bom começares a ler antes de contrariares o que as pessoas dizem. Como acho que deves entender, eu não venho aqui mandar postas de pescada, e quando falo é porque sei do que estou a falar.

C# Delegates and Events

Introduction to Delegates and Events

Events and delegates work hand-in-hand to provide a program's functionality. It starts with a class that declares an event. Any class, including the same class that the event is declared in, may register one of its methods for the event. This occurs through a delegate,...
 
fLaSh_CF,

Seria bom começares a ler antes de contrariares o que as pessoas dizem. Como acho que deves entender, eu não venho aqui mandar postas de pescada, e quando falo é porque sei do que estou a falar.

C# Delegates and Events

Introduction to Delegates and Events

Sim eu li, e percebi o que queres dizer.. tem calma só estou a tentar ajudar!
Os delegates são associados a subs/functions como os eventos, mas são coisas totalmente distintas nos seus fins..
 
Já percebi o que é um delegate, se bem que acho um pouco dificil ainda usar um :(

fLaSh_CF e _freelancer_, obrigado pela vossa prontidão e rapidez nas respostas, agradeço-vos por isso.


cumprimentos
 
Sim eu li, e percebi o que queres dizer.. tem calma só estou a tentar ajudar!
Os delegates são associados a subs/functions como os eventos, mas são coisas totalmente distintas nos seus fins..

Nem por isso... um evento tem associado uma lista de delegates que são executados quando o evento é disparado:

Ao fazer "Button1.OnClick += Button1_Click;" está-se a adicionar o delegate "Button1_Click" (EDIT: em rigor, uma instância do delegate EventHandler) à lista do evento "Click".
 
Última edição:
Boas,

Eu uso delegates em VB quando tenho projectos que têm referências/dependências uns dos outros. Como o Visual Studio ao adicionarmos uma referência de um projecto que esteja no topo da lista para um que está na base ele não deixa e avisa que temos referências circulares.

Para aceder à função que quero tenho de declarar

Public Delegate Function XXX(ByVal s As zzzz) As YYYY

O que faz com que consiga aceder à função através de um ponteiro.

Espero que dê para ter uma ideia melhor.

Cumps
 
Delegates são efectivamente "ponteiros" para funções. Um conceito muito simples de perceber onde usamos delegates sem por vezes termos noção disso, é no tratamento dos eventos. Imagina que tens uma aplicação Windows onde tens um simples botão. Nesse botão, queres que quando cliques nele, que se execute uma determinada acção.

Então o que fazes? No Visual Studio podes dar duplo-click nele de forma a que automáticamente seja criado o método Click e este seja associado ao botão. Para que esse método fique associado ao evento do Click, algures na definição dos forms estará algo:

Button1.OnClick += Button1_Click;

ou algo semelhante, que basicamente diz "o evento OnClick do Button1 vai ser tratado pelo método Button1_Click". Neste momento estás a criar um delegate, ou seja, estás a delegar tarefas pelos métodos.

Como é que os delegates e as threads se relacionam? Praticamente da mesma forma que os ponteiros para funções e as threads funcionam em C. Tipicamente crias threads que executam código de uma determinada função, para dizeres ao compilador qual a função que desejas que a thread execute, então irás estar a usar um delegate para o fazer.

A ideia base é mesmo que os delegates são uma espécie de ponteiros, com a excepção de que na realidade não são mesmo ponteiros, uma vez que em VB .NET (em managed code) não tens ponteiros.

em c# ja tens ponteiros :)
 
Sim eu li, e percebi o que queres dizer.. tem calma só estou a tentar ajudar!
Os delegates são associados a subs/functions como os eventos, mas são coisas totalmente distintas nos seus fins..

não são assim tão distintas!

em grosso modo um event é um objecto com um lista de delegates (function pointers)
 
Back
Topo