Il codice di esempio del mondo reale che è stato più volte richiesto, è già stato fornito in una risposta precedente dall'utente "Console.WriteLine".
Per quanto riguarda il motivo per cui è stato fornito, da quello che ho capito, Action è un modo per risparmiare continuando a definire nuovi delegati. Poiché si tratta di un delegato predefinito di determinati tipi di firma, si risparmia la seccatura di creare delegati diversi per ogni scopo previsto. Devi solo usare il delegato di azione predefinito per puntare ai tuoi metodi ed eseguirli. Lo stesso vale per i delegati di Func.
Più di una comodità, piuttosto che una nuova funzionalità. Aiuta a mantenere il tuo codice breve e comprensibile, con meno problemi.
Per quanto riguarda le vostre domande punto-saggio,
- Quali sono le differenza tra loro
Nessuna differenza. L'azione è un delegato predefinito, destinato a farti risparmiare la fatica di definire ripetutamente nuovi delegati.
- Quando utilizzare un delegato o un'azione
Tipicamente, un delegato (e di azione) viene utilizzato in luoghi in cui è necessario disporre di funzionalità tavolo-driven. cioè, forse un dizionario di metodi corrispondenti ad alcuni requisiti particolari. Nota che l'uso di Action qui rende facile cambiare il metodo finale chiamato, per indirizzare dinamicamente ad altri metodi (magari in base ad alcune impostazioni selezionate dall'utente?)
class Program
{
static void Main()
{
Dictionary<string, Action> dict = new Dictionary<string, Action>();
dict["loadFile"] = new Action(LoadFile);
dict["saveFile"] = new Action(SaveFile);
dict["loadFile"].Invoke();
dict["saveFile"].Invoke();
}
static void SaveFile()
{
Console.WriteLine("File saved!");
}
static void LoadFile()
{
Console.WriteLine("Loading File...");
}
}
Un altro uso tipico è per i metodi di callback. Esempio potrebbe essere il punto in cui si utilizza una classe BubbleSort, passando il metodo comparatore come delegato alla classe, che verrebbe utilizzato dalla classe BubbleSort per consentire al codice di definire la logica di confronto, mentre si prende cura di tutto il resto. Questo può essere utilizzato anche dai thread che hai avviato e il thread chiama il delegato quando alcune azioni intermedie devono essere informate sul tuo codice.
È possibile consultare questo post SO per vedere un ottimo esempio di quanto sopra. https://stackoverflow.com/a/3794229/1336068
- quando non utilizzare un delegato o un'azione
L'unico motivo che posso pensare di non usarle quando la situazione lo richiede, è se il vostro il delegato verrà chiamato milioni di volte in una breve durata. Vi è un leggero sovraccarico e se ciò causa un ritardo dell'applicazione, potrebbe essere necessario trovare un modo migliore per risolverlo utilizzando il riferimento diretto alle funzioni, anziché tramite un delegato.
- quando possono essere un eccesso di uccidere
Quando li si utilizza gratuitamente, senza alcuna reale necessità. Altrimenti, nella maggior parte delle situazioni, possono essere un modo elegante per risolvere gli scenari di cui sopra.
Inoltre, leggere questo SO rispondere per vedere le distinzioni tra i metodi normali, i delegati per ottenere una migliore comprensione di dove utilizzare i delegati/azione/func https://stackoverflow.com/a/17380580/1336068
Un'azione è un delegato la cui firma non ha parametri e ha nessun valore di ritorno. – Siege
Posso cercare e leggere il MSDN su questi rimorchi. Ma quello che sto cercando sono semplici esempi del mondo reale per delegati e azioni – HatSoft
Non è possibile utilizzare "Azione" senza utilizzare un delegato allo stesso tempo, poiché "Azione" è un tipo di delegato specifico. – CodesInChaos