Usuário com melhor resposta
O que é uma delegate?

Pergunta
-
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; } } }
- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 15 de fevereiro de 2011 20:32
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 24 de fevereiro de 2011 21:57
-
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
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 24 de fevereiro de 2011 21:57
-
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"); } } }
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 24 de fevereiro de 2011 21:57
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; } } }
- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 15 de fevereiro de 2011 20:32
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 24 de fevereiro de 2011 21:57
-
-
-
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... -
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
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 24 de fevereiro de 2011 21:57
-
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)- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 24 de fevereiro de 2011 21:57
- Não Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 24 de fevereiro de 2011 21:57
-
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"); } } }
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 24 de fevereiro de 2011 21:57