none
O que é uma delegate? RRS feed

  • Pergunta

  • O que é uma delegate? Alguém pode me explicar com exemplos?
    André Corrêa
    ANALISTA DE SISTEMAS
    (Em aprendizado de .NET)
    terça-feira, 15 de fevereiro de 2011 20:04

Respostas

  • Delegate é a definição de uma assinatura de um metodo...

    Em outras palavras, é como se vc declara-se uma variavel de um tipo de um metodo... server para a gente implementar um metodo de uma classe dentro de outro objeto...

    using System;
    
    namespace ConsoleApplication3 {
      public delegate int MetodoQueRetornaUmInteiro();
    
      public class Teste {
        public MetodoQueRetornaUmInteiro MetodoExterno { get; set; }
    
        public int Calcular() {
          if (this.MetodoExterno != null) return this.MetodoExterno();
          else return 0;
        }
      }
    
      class Program {
        static void Main(string[] args) {
          Teste teste = new Teste();
          teste.MetodoExterno = Program.MeuCalculoExterno;
          Console.WriteLine(teste.Calcular());
          Console.ReadKey();
        }
    
        static int MeuCalculoExterno() {
          return 10;
        }
      }
    }
    
    

     

    terça-feira, 15 de fevereiro de 2011 20:27
    Moderador
  • Oi Andre... eu usei um conversor... talves de algum problema.. (http://www.developerfusion.com/tools/convert/csharp-to-vb/)

    Namespace ConsoleApplication3
    	Public Delegate Function MetodoQueRetornaUmInteiro() As Integer
    
    	Public Class Teste
    		Public Property MetodoExterno() As MetodoQueRetornaUmInteiro
    			Get
    				Return m_MetodoExterno
    			End Get
    			Set
    				m_MetodoExterno = Value
    			End Set
    		End Property
    		Private m_MetodoExterno As MetodoQueRetornaUmInteiro
    
    		Public Function Calcular() As Integer
    			If Me.MetodoExterno IsNot Nothing Then
    				Return Me.MetodoExterno()
    			Else
    				Return 0
    			End If
    		End Function
    	End Class
    
    	Class Program
    		Private Shared Sub Main(args As String())
    			Dim teste As New Teste()
    			teste.MetodoExterno = AddressOf Program.MeuCalculoExterno
    			Console.WriteLine(teste.Calcular())
    			Console.ReadKey()
    		End Sub
    
    		Private Shared Function MeuCalculoExterno() As Integer
    			Return 10
    		End Function
    	End Class
    End Namespace
    
    
    
    quarta-feira, 16 de fevereiro de 2011 12:48
    Moderador
  •  

    Não à um evento... à um metodo... voce usar delegates para declarar um evento tambem... mas isso pq todo evento disparam um metodo... existem casos que vc usa delegates que não necessariamente estão envolvidos com eventos...

    Por exemplo... vc pode passar um delegate como um paramentro de um metodo para ser executado no final da operação em processos assincronos... ou para outras coisas...

    Veja esse exemplo, aqui eu uso um delegate para registrar o andamento de um processo, veja q o metodo Console.WriteLine não é um evento....

    Namespace WindowsFormsApplication1
    	NotInheritable Class Program
    		Private Sub New()
    		End Sub
    		Private Shared Sub Main()
    			Dim classe1 As New Classe1()
    			classe1.ExecutarSerieDeProcessos(AddressOf Console.WriteLine)
    			Console.ReadKey()
    		End Sub
    	End Class
    
    	Public Delegate Sub AtualizarLog(mensagem As String)
    
    	Public Class Classe1
    		Public Sub ExecutarSerieDeProcessos(atualizarLog As AtualizarLog)
    			RaiseEvent atualizarLog("Iniciando um processo")
    					' Faz um processo
    			Try
    			Catch e As Exception
    				RaiseEvent atualizarLog("Erro: " & e.Message)
    			End Try
    			RaiseEvent atualizarLog("Um processo concluido")
    
    			RaiseEvent atualizarLog("Iniciando outro processo")
    					' Faz outro processo
    			Try
    			Catch e As Exception
    				RaiseEvent atualizarLog("Erro: " & e.Message)
    			End Try
    			RaiseEvent atualizarLog("Outro processo concluido")
    
    			RaiseEvent atualizarLog("Iniciando mais um processo")
    					' Faz mais um processo
    			Try
    			Catch e As Exception
    				RaiseEvent atualizarLog("Erro: " & e.Message)
    			End Try
    			RaiseEvent atualizarLog("Mais um processo concluido")
    		End Sub
    	End Class
    End Namespace
    
    

     

    using System;
    
    namespace WindowsFormsApplication1 {
     static class Program {
      static void Main() {
       Classe1 classe1 = new Classe1();
       classe1.ExecutarSerieDeProcessos(Console.WriteLine);
       Console.ReadKey();
      }  
     }
    
     public delegate void AtualizarLog(string mensagem);
    
     public class Classe1 {
      public void ExecutarSerieDeProcessos(AtualizarLog atualizarLog) {
       if (atualizarLog != null) atualizarLog("Iniciando um processo");
       try {
        // Faz um processo
       } catch (Exception e) {
        if (atualizarLog != null) atualizarLog("Erro: " + e.Message);
       }
       if (atualizarLog != null) atualizarLog("Um processo concluido");
    
       if (atualizarLog != null) atualizarLog("Iniciando outro processo");
       try {
        // Faz outro processo
       } catch (Exception e) {
        if (atualizarLog != null) atualizarLog("Erro: " + e.Message);
       }
       if (atualizarLog != null) atualizarLog("Outro processo concluido");
    
       if (atualizarLog != null) atualizarLog("Iniciando mais um processo");
       try {
        // Faz mais um processo
       } catch (Exception e) {
        if (atualizarLog != null) atualizarLog("Erro: " + e.Message);
       }
       if (atualizarLog != null) atualizarLog("Mais um processo concluido");
      }
     }
    }
    
    
    quarta-feira, 16 de fevereiro de 2011 16:47
    Moderador

Todas as Respostas

  • Delegate é a definição de uma assinatura de um metodo...

    Em outras palavras, é como se vc declara-se uma variavel de um tipo de um metodo... server para a gente implementar um metodo de uma classe dentro de outro objeto...

    using System;
    
    namespace ConsoleApplication3 {
      public delegate int MetodoQueRetornaUmInteiro();
    
      public class Teste {
        public MetodoQueRetornaUmInteiro MetodoExterno { get; set; }
    
        public int Calcular() {
          if (this.MetodoExterno != null) return this.MetodoExterno();
          else return 0;
        }
      }
    
      class Program {
        static void Main(string[] args) {
          Teste teste = new Teste();
          teste.MetodoExterno = Program.MeuCalculoExterno;
          Console.WriteLine(teste.Calcular());
          Console.ReadKey();
        }
    
        static int MeuCalculoExterno() {
          return 10;
        }
      }
    }
    
    

     

    terça-feira, 15 de fevereiro de 2011 20:27
    Moderador
  • Rui, o método que vai ser "mapeado" ao delegate sempre deve ser estático?

    Abraço

    Estevam


    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    terça-feira, 15 de fevereiro de 2011 20:32
  • Tem um exemplo em VB?
    André Corrêa
    ANALISTA DE SISTEMAS
    (Em aprendizado de .NET)
    terça-feira, 15 de fevereiro de 2011 20:32
  • Rui, o método que vai ser "mapeado" ao delegate sempre deve ser estático?

    Abraço

    Estevam


    **** Se a reposta foi útil, então não esqueça de marca-lá. ***


    Não prescisa ser não... alias.. não importa se ele é estatico, privado, publico ou virtual... ele so tem que ter o mesmo tipo de retorno e os mesmos tipos de paramentros...

     

    quarta-feira, 16 de fevereiro de 2011 12:44
    Moderador
  • Oi Andre... eu usei um conversor... talves de algum problema.. (http://www.developerfusion.com/tools/convert/csharp-to-vb/)

    Namespace ConsoleApplication3
    	Public Delegate Function MetodoQueRetornaUmInteiro() As Integer
    
    	Public Class Teste
    		Public Property MetodoExterno() As MetodoQueRetornaUmInteiro
    			Get
    				Return m_MetodoExterno
    			End Get
    			Set
    				m_MetodoExterno = Value
    			End Set
    		End Property
    		Private m_MetodoExterno As MetodoQueRetornaUmInteiro
    
    		Public Function Calcular() As Integer
    			If Me.MetodoExterno IsNot Nothing Then
    				Return Me.MetodoExterno()
    			Else
    				Return 0
    			End If
    		End Function
    	End Class
    
    	Class Program
    		Private Shared Sub Main(args As String())
    			Dim teste As New Teste()
    			teste.MetodoExterno = AddressOf Program.MeuCalculoExterno
    			Console.WriteLine(teste.Calcular())
    			Console.ReadKey()
    		End Sub
    
    		Private Shared Function MeuCalculoExterno() As Integer
    			Return 10
    		End Function
    	End Class
    End Namespace
    
    
    
    quarta-feira, 16 de fevereiro de 2011 12:48
    Moderador
  • O que eu entendo por Delegate é apenas a atribuição de uma assinatura a um evento de um controle.

    Algo assim:

    ToolStripButton btn = new ToolStripButton();
    btn.Text =
    "Exemplo";
    btn.Click +=
    delegate { MessageBox.Show("Click do botão"); };
    SeuToolStripHerdado.Items.Add(btn);

    É isso?


    André Corrêa
    ANALISTA DE SISTEMAS
    (Em aprendizado de .NET)
    quarta-feira, 16 de fevereiro de 2011 13:20
  •  

    Não à um evento... à um metodo... voce usar delegates para declarar um evento tambem... mas isso pq todo evento disparam um metodo... existem casos que vc usa delegates que não necessariamente estão envolvidos com eventos...

    Por exemplo... vc pode passar um delegate como um paramentro de um metodo para ser executado no final da operação em processos assincronos... ou para outras coisas...

    Veja esse exemplo, aqui eu uso um delegate para registrar o andamento de um processo, veja q o metodo Console.WriteLine não é um evento....

    Namespace WindowsFormsApplication1
    	NotInheritable Class Program
    		Private Sub New()
    		End Sub
    		Private Shared Sub Main()
    			Dim classe1 As New Classe1()
    			classe1.ExecutarSerieDeProcessos(AddressOf Console.WriteLine)
    			Console.ReadKey()
    		End Sub
    	End Class
    
    	Public Delegate Sub AtualizarLog(mensagem As String)
    
    	Public Class Classe1
    		Public Sub ExecutarSerieDeProcessos(atualizarLog As AtualizarLog)
    			RaiseEvent atualizarLog("Iniciando um processo")
    					' Faz um processo
    			Try
    			Catch e As Exception
    				RaiseEvent atualizarLog("Erro: " & e.Message)
    			End Try
    			RaiseEvent atualizarLog("Um processo concluido")
    
    			RaiseEvent atualizarLog("Iniciando outro processo")
    					' Faz outro processo
    			Try
    			Catch e As Exception
    				RaiseEvent atualizarLog("Erro: " & e.Message)
    			End Try
    			RaiseEvent atualizarLog("Outro processo concluido")
    
    			RaiseEvent atualizarLog("Iniciando mais um processo")
    					' Faz mais um processo
    			Try
    			Catch e As Exception
    				RaiseEvent atualizarLog("Erro: " & e.Message)
    			End Try
    			RaiseEvent atualizarLog("Mais um processo concluido")
    		End Sub
    	End Class
    End Namespace
    
    

     

    using System;
    
    namespace WindowsFormsApplication1 {
     static class Program {
      static void Main() {
       Classe1 classe1 = new Classe1();
       classe1.ExecutarSerieDeProcessos(Console.WriteLine);
       Console.ReadKey();
      }  
     }
    
     public delegate void AtualizarLog(string mensagem);
    
     public class Classe1 {
      public void ExecutarSerieDeProcessos(AtualizarLog atualizarLog) {
       if (atualizarLog != null) atualizarLog("Iniciando um processo");
       try {
        // Faz um processo
       } catch (Exception e) {
        if (atualizarLog != null) atualizarLog("Erro: " + e.Message);
       }
       if (atualizarLog != null) atualizarLog("Um processo concluido");
    
       if (atualizarLog != null) atualizarLog("Iniciando outro processo");
       try {
        // Faz outro processo
       } catch (Exception e) {
        if (atualizarLog != null) atualizarLog("Erro: " + e.Message);
       }
       if (atualizarLog != null) atualizarLog("Outro processo concluido");
    
       if (atualizarLog != null) atualizarLog("Iniciando mais um processo");
       try {
        // Faz mais um processo
       } catch (Exception e) {
        if (atualizarLog != null) atualizarLog("Erro: " + e.Message);
       }
       if (atualizarLog != null) atualizarLog("Mais um processo concluido");
      }
     }
    }
    
    
    quarta-feira, 16 de fevereiro de 2011 16:47
    Moderador