Se non riesci a pensare ad una buona ragione per usare dinamica, allora stai rinunciando a potenziali controlli del tempo di compilazione per poco o nulla in cambio.
Preferisco i generici rispetto all'oggetto e preferisco l'oggetto rispetto alla dinamica, a meno che non sia necessario interagire con un linguaggio dinamico ScriptEngine o un contenitore dinamico come un modulo Web in cui è ragionevole gestire le potenziali eccezioni di runtime quando accedo a un campo mancante. Generics funzionerà al meglio; e con oggetto, stai almeno indicando che le tue intenzioni sono di memorizzare qualsiasi tipo di oggetto nello stesso contenitore.
La dinamica non è un tipo effettivo, e non è "oggetto", quindi dovrebbe mai essere usato per indicare "qualsiasi tipo di oggetto", dovrebbe effettivamente essere usato quando sapere qual è il contratto dell'oggetto (metodo / firma della proprietà); è un veicolo di dispacciamento runtime per mantenere la stessa sintassi comoda per un'attività non sicura (o almeno legata dinamicamente). È come dire:
"OK, I know the activity I'm doing is subject to runtime dispatch and
runtime errors, so give me the syntactical sugar anyway"
Quando vedo dinamico, presumo di solito che sia imminente:
- richiama la chiamata del metodo a un tipo con collegamento dinamico (come una variabile IronPython)
- accesso a dati di moduli dinamici con sintassi di proprietà in un controller MVC
Anche se un altro uso legittimo è quello di utilizzare la capacità di invio dinamico per implementare il Visitor Pattern
, anche se i metodi virtuali tradizionali sono probabilmente più veloci.
class FooVisitor {
void Accept(Expression node) { ... }
void Accept(Statement node) { ... }
}
foreach(dynamic node in ASTNodes) {
visitor.Accept(obj); // will be dispatched at runtime based on type of each obj
}
Non usarlo quando:
- Le prestazioni sono numero uno
- Il controllo statico del tipo è auspicabile per un runtime più robusto
- I tipi possono essere derivati in fase di compilazione
- Un tipo generico farà
Se usato inutilmente, la dinamica può effettivamente ridurre la robustezza del tuo codice cambiando C # in un linguaggio di scripting dinamico.