Risposte:
Un delegato è un tipo denominato che definisce un particolare tipo di metodo. Proprio come una definizione di classe delinea tutti i membri per il tipo di oggetto che definisce, il delegato definisce la firma del metodo per il tipo di metodo che definisce.
In base a questa istruzione, un delegato è un puntatore a funzione e definisce l'aspetto di tale funzione.
Un ottimo esempio per un'applicazione del mondo reale di un delegato è il predicato . Nell'esempio dal collegamento, noterai che Array.Find prende l'array per la ricerca e quindi un predicato per gestire i criteri di cosa trovare. In questo caso passa un metodo ProductGT10 che corrisponde alla firma del predicato.
Come indicato in "Apprendimento di C # 3.0: padronanza dei fondamenti di C # 3.0"
Scenario generale: quando un capo di stato muore, il presidente degli Stati Uniti in genere non ha il tempo di partecipare personalmente al funerale. Invece, invia un delegato. Spesso questo delegato è il Vice Presidente, ma a volte il VP non è disponibile e il Presidente deve inviare qualcun altro, come il Segretario di Stato o anche la First Lady. Non vuole "cablare" la sua autorità delegata a una singola persona; potrebbe delegare questa responsabilità a chiunque sia in grado di eseguire il protocollo internazionale corretto.
Il Presidente definisce in anticipo quale responsabilità sarà delegata (partecipazione al funerale), quali parametri verranno passati (cordoglio, parole gentili) e quale valore spera di ottenere (buona volontà). Assegna quindi una persona in particolare a quella responsabilità delegata al "runtime" man mano che il corso della sua presidenza progredisce.
Nella programmazione Scenario: ti trovi spesso di fronte a situazioni in cui devi eseguire una particolare azione, ma non sai in anticipo quale metodo, o anche quale oggetto, vorrai invocare per eseguirla.
Ad esempio: un pulsante potrebbe non sapere quale oggetto o quali oggetti devono essere notificati. Piuttosto che collegare il pulsante a un oggetto particolare, connetterete il pulsante a un delegato e quindi risolverete quel delegato a un metodo particolare quando il programma viene eseguito.
Un utilizzo comune dei delegati per elenchi generici è tramite i delegati di azione (o il suo equivalente anonimo) per creare un'operazione foreach di una riga:
myList.Foreach( i => i.DoSomething());
Trovo anche il delegato Predicate molto utile nella ricerca o nell'eliminazione di un elenco:
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
So che hai detto che non è richiesto alcun codice, ma trovo più semplice esprimere la sua utilità tramite codice. :)
Se sei interessato a vedere come viene utilizzato il pattern Delegate nel codice del mondo reale, non guardare oltre Cocoa su Mac OS X. Cocoa è il toolkit UI preferito da Apple per la programmazione in Mac OS X ed è codificato in Objective C. progettato in modo che ogni componente dell'interfaccia utente sia destinato ad essere esteso tramite delega piuttosto che sottoclasse o altri mezzi.
Per ulteriori informazioni, consiglio di controllare cosa ha da dire Apple sui delegati qui .
Avevo un progetto che utilizzava win32 Python.
Per vari motivi, alcuni moduli hanno utilizzato odbc.py per accedere al DB e altri moduli - pyodbc.py.
Si verificava un problema quando una funzione doveva essere utilizzata da entrambi i tipi di moduli. Aveva un oggetto di connessione passato come argomento, ma poi doveva sapere se usare dbi.dbiDate o datetime per rappresentare i tempi.
Questo perché odbc.py prevedeva, come valori nelle istruzioni SQL, date come dbi.dbiDate mentre pyodbc.py prevedeva valori datetime.
Un'ulteriore complicazione era che gli oggetti connessione creati da odbc.py e pyodbc.py non consentivano di impostare campi aggiuntivi.
La mia soluzione era racchiudere gli oggetti di connessione restituiti da odbc.odbc (...) e pyodbc.pyodbc (...) da una classe delegato, che contiene la funzione di rappresentazione dell'ora desiderata come valore di un campo extra e che delegati tutte le altre richieste di campo all'oggetto connessione originale.
Ho avuto la tua stessa domanda e sono andato su questo sito per una risposta.
Apparentemente, non l'ho capito meglio anche se ho sfogliato gli esempi su questo thread.
Ho trovato un ottimo uso per i delegati ora che ho letto: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx
Questo potrebbe sembrare più ovvio per i nuovi utenti perché Forms è molto più complicato da trasmettere valori rispetto ai siti Web ASP.NET con POST / GET (QueryString) ..
Fondamentalmente si definisce un delegato che accetta "TextBox text " come parametri.
// Form1
// 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();
}
// SOMMARIO: Definisci delegato, crea un'istanza della nuova classe Form2, assegna la funzione funData () a delegare, passa la tua casella di testo al delegato. Mostra il modulo.
// Form2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
// SOMMARIO: prendi semplicemente TextBox txtForm1 come parametri (come definito nel tuo delegato) e assegna il testo dell'etichetta al testo della casella di testo.
Spero che questo illumini un po 'di utilizzo sui delegati :)
Una rapida ricerca su Google ha prodotto questo http://en.wikipedia.org/wiki/Delegation_pattern . Fondamentalmente, ogni volta che usi un oggetto che inoltra le sue chiamate a un altro oggetto, stai delegando.