Differenze fondamentali tra un'azioneAzione vs Azione

2

C'è una differenza fondamentale tra l'utilizzo di un'azione e un elenco di azioni? Vedere che l'azione è un delegato e quindi è una lista stessa. Ad esempio:

List<Action> technicallyRedundant = new List<Action>();
technicallyRedundant.Add(() => { Console.WriteLine("Action 1"); });
technicallyRedundant.Add(() => { Console.WriteLine("Action 2"); });

Questa architettura è più leggibile? Quale sarebbe l'uso consigliato durante l'esposizione per una libreria esterna?

Action act = null;
act += () => { Console.WriteLine("Action 1"); }
act += () => { Console.WriteLine("Action 2"); }
    
posta johnny 5 12.03.2018 - 01:32
fonte

2 risposte

6

Sì, c'è una differenza fondamentale tra i due: sicurezza del tipo.

Sebbene GetInvocationList possa effettivamente essere richiamato su act nell'esempio, non restituisce un elenco, restituisce un array di Delegate . Di conseguenza, per eseguirlo è necessario utilizzare il DynamicInvoke più lento ed è possibile passare facilmente i parametri errati, come dimostrato dal seguente codice compilabile:

Action act = null;
act += () => { Console.WriteLine("Action 1"); };
act += () => { Console.WriteLine("Action 2"); };
foreach (var action in act.GetInvocationList())
{
    action.DynamicInvoke("1");
}

Esegui e genererà un TargetParameterCountException .

Mentre con List<Action> , abbiamo una lista strongmente tipizzata. In qualsiasi iterazione, avremmo a che fare con Action , anziché Delegate . Pertanto è possibile utilizzare Invoke() , che conosce i requisiti dei parametri.

    
risposta data 12.03.2018 - 10:45
fonte
2

La principale differenza è interna. Delegato è una lista collegata; Lista usa un array internamente. Per un'API pubblica, non si dovrebbe usare neanche. L'elenco non dovrebbe essere esposto nelle proprietà e un delegato pubblico è di solito un evento. Forse preferisci un parametro delegato.

Come diceva l'altro poster, List è strongmente digitato, ma un evento può anche essere strongmente digitato. Il delegato verrà quindi nascosto nel codice generato.

Guarda le Linee guida per la progettazione di quadri per la proprietà e l'evento della raccolta pubblica. / delegare le linee guida.

    
risposta data 15.03.2018 - 02:23
fonte

Leggi altre domande sui tag