Respostas:
Um delegado é um tipo nomeado que define um tipo específico de método. Assim como uma definição de classe apresenta todos os membros para o tipo de objeto que define, o delegado define a assinatura do método para o tipo de método que define.
Com base nessa declaração, um delegado é um ponteiro de função e define a aparência dessa função.
Um ótimo exemplo para uma aplicação do mundo real de um delegado é o Predicado . No exemplo do link, você notará que Array.Find pega a matriz para pesquisar e, em seguida, um predicado para lidar com os critérios do que encontrar. Nesse caso, ele passa um método ProductGT10 que corresponde à assinatura do Predicado.
Conforme declarado em "Aprendendo C # 3.0: Domine os fundamentos do C # 3.0"
Cenário geral: quando um chefe de estado morre, o presidente dos Estados Unidos normalmente não tem tempo para comparecer ao funeral pessoalmente. Em vez disso, ele envia um delegado. Freqüentemente, esse delegado é o vice-presidente, mas às vezes o vice-presidente não está disponível e o presidente deve enviar outra pessoa, como o secretário de Estado ou mesmo a primeira-dama. Ele não quer “conectar” sua autoridade delegada a uma única pessoa; ele pode delegar essa responsabilidade a qualquer pessoa que seja capaz de executar o protocolo internacional correto.
O Presidente define com antecedência quais responsabilidades serão delegadas (comparecimento ao funeral), quais parâmetros serão passados (condolências, palavras gentis) e que valor espera receber (boa vontade). Ele então designa uma pessoa específica para essa responsabilidade delegada em “tempo de execução”, conforme o curso de sua presidência progride.
Cenário de programação: Você frequentemente se depara com situações em que precisa executar uma ação específica, mas não sabe com antecedência qual método, ou mesmo qual objeto, deseja chamar para executá-lo.
Por exemplo: Um botão pode não saber qual objeto ou objetos precisam ser notificados. Em vez de conectar o botão a um objeto específico, você conectará o botão a um delegado e, em seguida, resolverá esse delegado a um método específico quando o programa for executado.
Um uso comum de delegados para listas genéricas é por meio de delegados de ação (ou seu equivalente anônimo) para criar uma operação foreach de uma linha:
myList.Foreach( i => i.DoSomething());
Também acho o delegado Predicate bastante útil na pesquisa ou poda de uma lista:
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
Eu sei que você disse que nenhum código é necessário, mas acho mais fácil expressar sua utilidade por meio de código. :)
Se você estiver interessado em ver como o padrão Delegate é usado no código do mundo real, não procure além do Cocoa no Mac OS X. Cocoa é o kit de ferramentas de IU preferido da Apple para programação no Mac OS X e é codificado no Objective C. projetado de forma que cada componente de UI seja estendido por meio de delegação, em vez de subclassificação ou outros meios.
Para obter mais informações, recomendo verificar o que a Apple tem a dizer sobre os delegados aqui .
Eu tinha um projeto que usava win32 Python.
Por vários motivos, alguns módulos usaram odbc.py para acessar o banco de dados e outros módulos - pyodbc.py.
Ocorreu um problema quando uma função precisava ser usada por ambos os tipos de módulos. Um objeto de conexão foi passado para ele como um argumento, mas então ele teve que saber se deveria usar dbi.dbiDate ou datetime para representar tempos.
Isso ocorria porque odbc.py esperava, como valores em instruções SQL, datas como dbi.dbiDate, enquanto pyodbc.py esperava valores de data e hora.
Uma outra complicação era que os objetos de conexão criados por odbc.py e pyodbc.py não permitiam definir campos adicionais.
Minha solução foi envolver os objetos de conexão retornados por odbc.odbc (...) e pyodbc.pyodbc (...) por uma classe de delegado, que contém a função de representação de tempo desejada como o valor de um campo extra e que delega todas as outras solicitações de campo para o objeto de conexão original.
Eu tinha a mesma pergunta que você e fui a este site para obter uma resposta.
Aparentemente, eu não entendi melhor, embora tenha lido os exemplos neste tópico.
Descobri um ótimo uso para delegados agora que li: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx
Isso pode parecer mais óbvio para novos usuários porque Forms é muito mais complicado de passar valores do que sites ASP.NET com POST / GET (QueryString).
Basicamente, você define um delegado que usa "TextBox text " como parâmetros.
// Formulário 1
// Class Property Definition
public delegate void delPassData(TextBox text);
// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
Form2 frm= new Form2();
delPassData del=new delPassData(frm.funData);
del(this.textBox1);
frm.Show();
}
// RESUMO: Definir delegado, instanciar nova classe Form2, atribuir função funData () para delegar, passar seu textBox para o delegado. Mostre o formulário.
// Form2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
// RESUMO: Simplesmente pegue TextBox txtForm1 como parâmetros (conforme definido em seu delegado) e atribua o texto do rótulo ao texto do textBox.
Espero que isso esclareça alguma utilidade em delegados :) ..
Uma rápida pesquisa no Google encontrou este http://en.wikipedia.org/wiki/Delegation_pattern . Basicamente, sempre que você usa um objeto que encaminha suas chamadas para outro objeto, você está delegando.