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.