Mancanze nell'utilizzo di tipi dinamici in C #

14

Ultimamente sto studiando di più sui tipi dinamici in C #. Con alcuni esempi ho capito una volta che il codice è stato compilato, non è necessario ricompilarlo nuovamente ma può essere eseguito direttamente.

Ritengo che la flessibilità fornita dalla parola chiave per poter effettivamente cambiare tipo di dati a piacimento sia un ottimo vantaggio .

Domanda,

Esistono eventuali carenze specifiche oltre alle chiamate al metodo dinamico errate che generano eccezioni del tempo di esecuzione che gli sviluppatori devono conoscere prima di avviare l'implementazione.

    
posta Karthik Sreenivasan 15.02.2012 - 10:56
fonte

4 risposte

16

Il difetto principale è che si butta via una delle proprietà principali (non necessariamente vantaggi) di C # - che è tipizzata staticamente (e per la maggior parte parte sicura).

Il problema con la digitazione dinamica è che spesso nasconde bug che verrebbero altrimenti rivelati durante la compilazione. Tale bug si manifesta solo in fase di esecuzione, il che ovviamente rende molto più difficile da rilevare.

Ci sono alcuni IMO pochi motivi per utilizzare la digitazione dinamica in C #, il principale è la collaborazione con le lingue digitate dinamicamente ( che è AFAIK la ragione per cui la dinamica è stata introdotta in primo luogo).

Se vuoi fare una programmazione completamente tipizzata in modo dinamico, dovresti considerare un linguaggio che è stato progettato per essere dinamico, non il hack C # per essere dinamico. Puoi usare ad esempio IronPython se vuoi usare le librerie .Net

    
risposta data 15.02.2012 - 11:44
fonte
9

Non sono sicuro del tipo di carenze che stai cercando, ma se vuoi sapere quali funzionalità funzionano con la tipizzazione statica, ma non con dynamic , ce ne sono alcune:

  1. I metodi di estensioni non funzionano. Questo è probabilmente il più grande. Se hai dynamic collection , non puoi utilizzare il codice come collection.Distinct() . Questo perché i metodi di estensione disponibili dipendono dallo spazio dei nomi using s e il DLR non ha modo di conoscerli.

    Per ovviare al problema, puoi invocare il metodo come se fosse un normale metodo statico: Enumerable.Distinct(collection) . Oppure puoi modificare il tipo di raccolta in qualcosa come IEnumerable<dynamic> .

  2. foreach richiede IEnumerable . Nel normale C #, foreach è basato sul modello. Cioè, non richiede alcuna interfaccia specifica, solo un metodo GetEnumerator() che restituisce l'oggetto adatto. Se utilizzi foreach su dynamic , è richiesta l'implementazione di IEnumerable . Ma dal momento che il motivo di questo comportamento è che C # 1.0 non ha generici, questa "mancanza" è praticamente irrilevante.

risposta data 15.02.2012 - 13:22
fonte
7

Il problema con i tipi dinamici (non le variabili dichiarate come dinamiche) in .net è che non hanno molte delle funzionalità disponibili per i tipi statici.

  • non c'è riflessione (puoi scorrere i membri ma non molto altro)
  • no metadata (esiste la tua convalida nei siti di dati dinamici / mvc)
  • assolutamente nessun controllo in fase di compilazione (eventuali errori di ortografia non verranno rilevati)
  • poiché questa è una funzione potente, i noob possono tendere ad abusare / abusare / fraintenderlo
  • Il codice
  • scritto con tipi dinamici tende ad essere difficile da mantenere e dannatamente difficile da refactoring
  • a causa della digitazione anatra e di altre caratteristiche, i guru possono scrivere codice illeggibile per chiunque altro

Quindi non scrivere codice con tipi dinamici a meno che tu non sappia cosa stai facendo.

    
risposta data 15.02.2012 - 18:48
fonte
6

Poiché dynamic è solo un% marcatoobject inserisce i tipi di valore.

Questo può avere implicazioni sulle prestazioni, ma dal momento che utilizzerei la tipizzazione statica nel codice critico delle prestazioni in ogni caso, probabilmente non è un problema nella pratica.

Questa boxe interferisce anche con i tipi di valore mutabili. Se li modifichi con dynamic , modifichi solo la copia in scatola. Ma poiché non dovresti usare i tipi di valore mutabili in primo luogo, anche questo non è un grosso problema.

    
risposta data 15.02.2012 - 17:45
fonte

Leggi altre domande sui tag