Dove uso i delegati? [chiuso]


109

Quali sono alcuni luoghi del mondo reale che richiedono delegati? Sono curioso di sapere quali situazioni o schemi sono presenti in cui questo metodo è la soluzione migliore. Nessun codice richiesto.

Risposte:


33

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.


154

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.


1
Allora perché non usare semplicemente funzioni / lambda anonime?
Pacerier

5
@Pacerier Questa è una risposta tardiva e potresti aver scoperto la risposta, ma per il bene di altri lettori che la trovano: una funzione anonima è un tipo di delegato.
Anthony

10
@ Anthony + Pacerier: un metodo anonimo NON è un delegato. Un metodo anonimo è un pezzo di codice. Un delegato è un puntatore che punta a quella parte di codice. Non è possibile avere un metodo anonimo senza un delegato che lo punta, altrimenti non verrebbe mai chiamato. Un lambda è un operatore, utilizzato per costruire espressioni lambda. Le espressioni lambda per lo più risultano in metodi anonimi che verranno indicati da ... un delegato.
Martin Mulder

Stupido me, ma creerei semplicemente un'istruzione If ElseIf se non sapessi l'uso quando è stato premuto il pulsante. Ho detto sciocco me.
JustJohn

Il metodo anonimo @Pacerier introdotto in C # 2.0 e Lambda introdotto in C # 3.0 se Lambda fosse stato introdotto per primo, non ci sarebbero mai stati metodi anonimi e nemmeno delegati!
AminM

18

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. :)


13

L'associazione di eventi ai gestori di eventi è in genere la tua prima introduzione ai delegati ... Potresti anche non sapere che li stavi usando perché il delegato è racchiuso nella classe EventHandler.


5

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 .


5

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.


5

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 :)


Il metodo della classe Form2 deve essere denominato funData (invece di passData) o l'assegnazione della funzione Form1 deve essere denominata frm.passData (invece di frm.funData).
ethan

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.