2009-03-11 2 views
9

Sono sempre alla ricerca di un modo per utilizzare tutti gli strumenti che posso e di allungarmi appena oltre il punto in cui mi trovo. Ma per quanto ho letto sui delegati, non riesco mai a trovare un posto dove usarli (come Interfacce, Generics e un sacco di cose, ma sto divagando.) Speravo che qualcuno potesse mostrarmi quando e come hanno usato un delegato in web programmazione per asp.net C# (2.0 e versioni successive).Quando dovrei usare un delegato in asp.net?

Grazie e se questo non funziona per Stack Overflow, per favore fammelo sapere.

+0

vedere anche un q generale: http://stackoverflow.com/questions/31497/where-do-i-use-delegates – nawfal

risposta

7

bdukes ha ragione sugli eventi. Ma non sei limitato a usare solo delegati con eventi.

Studiare il classico modello di osservatore per ulteriori esempi sull'utilizzo dei delegati. Alcuni testi sul modello puntano a un modello di evento, ma da una prospettiva di apprendimento raw, non è necessario utilizzare gli eventi.

Una cosa da ricordare: un delegato è solo un altro tipo che può essere utilizzato & passato in giro simile ai tuoi tipi primitivi come un "int". E proprio come "int", un delegato ha le sue caratteristiche speciali che puoi agire nella tua codifica quando consumi il tipo di delegato.

Per ottenere un ottimo controllo sull'argomento e su alcuni aspetti più avanzati e dettagliati, leggere il libro di Joe Duffy, .NET Framework 2.0.

5

Bene, ogni volta che gestisci un evento, stai utilizzando un delegato.

3

Per rispondere innanzitutto alla tua seconda domanda, penso che questa sia una grande domanda per StackOverflow!

Sul primo, un esempio sarebbe l'ordinamento. Il metodo Sort() su List accetta un delegato per eseguire l'ordinamento, così come il metodo Find(). Non sono un grande fan dell'ordinamento nel database, quindi mi piace usare Sort() sui miei set di risultati. Dopo tutto, l'ordine di un elenco è molto più un problema di interfaccia utente (in genere) che un problema di regola aziendale.

Modifica: ho aggiunto i motivi per l'ordinamento all'esterno del DB alla domanda appropriata here.

Modifica: la funzione di confronto utilizzata nella routine di ordinamento è delegata. Pertanto, se si ordina una lista utilizzando il metodo .Sort (Comparison (T)), il metodo di confronto (T) che si passa alla funzione di ordinamento è un delegato. Vedi .Sort (Confronto (T)) documentation.

+0

Solo per curiosità: Cosa c'è che non va sull'ordinamento nel database? –

+0

Non c'è assolutamente nulla di sbagliato nell'ordinamento nel DB, in effetti con una grande quantità di informazioni che non dovresti fare senza fare ciò – eglasius

+0

@Adrian: Non mi iscrivo a questa vista, ma chi fa apparire tre punti: 1) Normalmente il db trasporta il carico pesante, mentre i clienti hanno CPU in più. Se è possibile spostare l'ordinamento sul client, è possibile migliorare la scalabilità. [continua] –

1

Un altro esempio potrebbe essere la pubblicazione di eventi per i controlli utente.

Es.

// In your user control 
public delegate void evtSomething(SomeData oYourData); 
public event evtSomething OnSomething; 

// In the page using your user control 
ucYourUserControl.OnSomething += ucYourUserControl_OnSomething; 

// Then implement the function 
protected void ucYourUserControl_OnSelect(SomeData oYourData) 
{ 
    ... 
} 
2

Un altro esempio veloce in cima alla mia testa sarebbe stato il test dell'unità con Rhino Mocks. Molte delle cose che puoi fare con Rhino Mocks utilizzano i delegati e le espressioni lambda.

1

Recentemente ho usato i delegati per "delegare" il controllo delle autorizzazioni.

public Func CheckPermission;

In questo modo, la funzione CheckPermission può essere condivisa da vari controlli o classi, dirla in una classe statica o in una classe di utilità, e comunque gestita centralmente, evitando anche l'esplosione di interfaccia; solo un pensiero

1

È possibile utilizzare i delegati quando si sa che si vorrà intraprendere qualche azione, ma i dettagli di tale azione dipenderanno dalle circostanze.

Tra le altre cose, abbiamo utilizzare delegati per:

  • ordinamento e filtraggio, soprattutto se l'utente può scegliere tra diversi criteri di ordinamento/filtro
  • codice Semplificazione. Ad esempio, un processo piuttosto lungo in cui l'inizio e la fine sono sempre gli stessi, ma un piccolo bit medio varia. Invece di avere un blocco difficile da leggere se nel mezzo, ho un metodo per l'intero processo e passaggio in un delegato (Azione) per il bit centrale.
  • Ho un metodo ToString molto utile nel mio livello di presentazione che converte una raccolta di qualsiasi cosa in un elenco separato da virgole. I parametri del metodo sono un delegato IEnumerable e Func per trasformare ogni T nella raccolta in una stringa. Funziona egualmente bene per mettere insieme gli utenti con il loro FirstName o per elencare i progetti con il loro ID.