1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Delegates em VisualBasic .NET

Discussão em 'Programação' iniciada por zericpxt, 22 de Outubro de 2008. (Respostas: 13; Visualizações: 1211)

  1. zericpxt

    zericpxt [email protected] 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: 22 de Outubro de 2008
  2. fLaSh_CF

    fLaSh_CF Banido

    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: 22 de Outubro de 2008
  3. _freelancer_

    _freelancer_ Power Member

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

    fLaSh_CF Banido

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

    _freelancer_ Power Member

    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

     
  6. fLaSh_CF

    fLaSh_CF Banido

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

    zericpxt [email protected] Member

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

    SoundSurfer Power Member

    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: 22 de Outubro de 2008
  9. PJ

    PJ Power Member

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

    KiKas Power Member

    em c# ja tens ponteiros :)
     
  11. KiKas

    KiKas Power Member

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

    em grosso modo um event é um objecto com um lista de delegates (function pointers)
     
  12. _freelancer_

    _freelancer_ Power Member

    Não sabia. :eek:

    E tens ponteiros em managed code? Consegues-me arranjar um ou dois tutorials/artigos sobre isso?
     
  13. SoundSurfer

    SoundSurfer Power Member

    Pronto, aí tens um ponteiro :D

    Agora a sério:

    http://msdn.microsoft.com/en-us/library/y31yhkeb(VS.80).aspx
     
    Última edição: 25 de Outubro de 2008
  14. _freelancer_

    _freelancer_ Power Member

    Malandro :D isso é uma referência para um objecto, que não permite aritmética de ponteiros, logo, não é um ponteiro. ;)

    Mas o artigo é interessante, não sabia mesmo que existiam ponteiros verdadeiros no C#.
     

Partilhar esta Página