2009-08-18 14 views
11

Possibili duplicati:
Delegate Usage : Business Applications
Where do I use delegates?Best practice: quando devo utilizzare un delegato in .NET?

Hi,

Sono nuovo al concetto di un delegato in .NET - non ho davvero li usate ancora e penso che probabilmente sono lì per una buona ragione - quando dovrei usare un delegato?

Gli esempi sono molto graditi.

+0

Ci sono molte domande simili, come questa: http://stackoverflow.com/questions/31497/where-do-i-use-delegates –

+0

Oppure questo: http://stackoverflow.com/questions/628803/delegate-usage-business-applications –

+0

Oppure questo: http://stackoverflow.com/questions/635015/when-would-i-use-a-delegate-in-asp-net –

risposta

4

I delegati sono utili quando è necessario comunicare un'altra parte del codice come fare. Gli eventi sono l'esempio più semplice: separare l'evento (qualcosa è accaduto) da in che modo gestirlo. Altri esempi sono alcune operazioni iterative comuni, come una consuetudine ritrovamento:

List<Foo> foos = new List<Foo>(); 
foos.Find(delegate(Foo foo) 
    { 
     if(foo.CustomProperty.Contains("special value")) 
     { 
      return false; 
     } 
     return true; 
    }); 

Quanto sopra è un esempio del tutto arbitraria, ma rende il punto che si può separare la cosa (l'iterazione e l'esecuzione di un "trovare" criteri) dal come (come determinare se viene trovato qualcosa).

2

Events utilizzare i delegati dietro le quinte.

Se si utilizzano eventi si sono utilizzati delegati ma solo con una sintassi più gradevole.

Fondamentalmente un loro utilizzo è per richiamate o programmazione basata su eventi.

2

I delegati vengono utilizzati per la programmazione guidata da eventi. Le migliori pratiche riguardano spesso il codice di disaccoppiamento (o accoppiamento "libero"). Usando i delegati puoi iscrivere i metodi agli eventi, invece di avere X chiamata Y se succede qualcosa, e quindi Y chiama Z sotto una certa condizione e così via.

8

I delegati forniscono un modo per passare il comportamento come parametro.

Gli esempi comuni sono Eventi e programmazione asincrona in cui qualcosa di diverso dal proprio oggetto è responsabile della chiamata nel proprio oggetto. Fornisci quell'evento a un delegato e ora è in grado di eseguire il comportamento associato a tale delegato.

Questa può anche essere una tecnica utile quando si implementa un algoritmo generale. Ci sono state volte in cui sto scrivendo più metodi che sono molto simili. Forse si collegano lo stesso insieme di dati, ma eseguono compiti leggermente diversi. Posso passare un delegato a una singola funzione per eseguire quell'attività, quindi chiamare il delegato dall'interno del ciclo sui dati. In questo modo non devo implementare il loop sui dati più volte, devo solo scrivere un nuovo codice che faccia cose nuove - il comportamento comune è tutto catturato in un modo comune.

In risposta al commento:

La differenza tra chiamare il delegato all'interno del loop e chiamando il metodo all'interno del loop è che il delegato è un parametro per la funzione che contiene il ciclo. Ciò significa che quella funzione potrebbe fare qualsiasi cosa, non solo ciò che è definito all'interno di un particolare metodo.Questa flessibilità può essere sfruttata e utilizzata per fornire algoritmi generici nelle librerie completamente indipendenti dalle specifiche di ciò su cui gli algoritmi stanno lavorando. Linq è un ottimo esempio della generalità consentita dalla flessibilità dei delegati.

+0

La tua risposta è un po 'vaga per me. qual è la differenza tra chiamare un delegato dall'eliminare il ciclo e chiamare un metodo semplice all'interno di quel ciclo? –

2

Events and Callbacks nelle linee guida .NET lo spiega bene.

In sintesi, si consiglia di preferire gli eventi in API semplici perché c'è un forte supporto IDE e la maggior parte degli sviluppatori si trova a proprio agio con gli eventi. Tuttavia, se hai bisogno che l'utente fornisca il codice che verrà eseguito, dovresti considerare l'utilizzo di delegati o membri virtuali. Le callback sono meno performanti, ma se si usano delegati come Action e Func si consente lambda.

3

Inoltre, mi consiglia di utilizzare tipi di delegati generici invece di crearne uno personalizzato. Esempi di seguito:

EventHandler< TEventArgs>
Func< TResult>
Func< T1, T2, TResult>
Funz ecc ...
Action< T1>
Action< T1, T2>
azione ecc ...

+1

Aaron - questo è un buon punto. Le linee guida sulla progettazione di framework ora indicano che è necessario evitare di creare delegati personalizzati- http://blogs.msdn.com/brada/archive/2009/01/26/framework-design-guidelines-avoiding-custom-delegates.aspx – RichardOD

1
caso

Esempio: una singola risorsa viene utilizzato da più oggetti . La risorsa ha bisogno di un callback asincrono per questi oggetti, ma la natura della risorsa richiede che solo una richiesta sia attiva in un dato momento e che la richiesta sia legata a un particolare oggetto. A causa dell'architettura, non voglio passare gli oggetti nella risorsa, quindi, invece, invio la risorsa a un delegato di ciascun oggetto e memorizzo questi delegati insieme agli identificatori di oggetto. Quando viene effettuata una richiesta, posso cercare l'identificatore dell'oggetto corrispondente e chiamare il suo delegato specifico.

Inizialmente l'ho implementato con un evento, ma poiché l'evento non poteva essere "mirato" a un particolare oggetto, stavo riscontrando problemi. Non sono sicuro che questa sia la pratica migliore, ma sembra funzionare bene per me.