Ho trovato due modi diversi per inizializzare un delegato con un'azione:Azione per delegare: nuova azione o azione di lancio?
Creare una nuova azione o lanciare su Azione.
Delegate foo = new Action(() => DoNothing(param));
Delegate bar = (Action)(() => DoNothing(param));
C'è una differenza tra queste 2 sintassi?
Quale è migliore e perché?
Edit:
delegato è l'uso in questo esempio perché la sintassi è utile per richiamare metodi come BeginInvoke o invocare con un'espressione lambda, ed è importante per lanciare l'espressione lambda in un'azione
static main
{
Invoke((Action)(() => DoNothing())); // OK
Invoke(new Action(() => DoNothing())); // OK
Invoke(() => DoNothing()); // Doesn't compil
}
private static void Invoke(Delegate del) { }
Ma è interessante vedere che il compilatore ha autorizzato questo:
Action action =() => DoNothing();
Invoke(action);
Per la tua modifica: Che significato il contenuto sarebbe nel tuo metodo 'Invoke'' statico'? –
Niente di interessante. Lo scopo della domanda è solo capire la differenza tra le 2 sintassi. La mia vera implementazione è in un'applicazione WPF quando chiamo Dispatcher.Invoke() (http://msdn.microsoft.com/en-us/library/cc647509(v=vs.100).aspx) – Hyralex
Vedo. Dovresti ancora ricordare che un 'Azione' ___is___ un 'Delegato ', poiché' Azione' deriva da' Delegato '. Quindi, anche se usi un overload che accetta un 'Delegate', puoi dargli un' Action'. Esempio: 'Action bar =() => DoNothing (param); someDispatcher.BeginInvoke (bar); '(vedi [' Dispatcher.BeginInvoke'] (http://msdn.microsoft.com/en-us/library/cc190824.aspx)). Aggiunta: in una versione più recente del framework, .NET 4.5, c'è un sovraccarico di 'Dispatcher.Invoke' che richiede' Azione', ma solo per comodità, vedi http://msdn.microsoft.com/en-us/library /hh199416.aspx. –