2010-08-09 13 views
23

Ho usato la dinamica e il tipo di oggetto in modo intercambiabile. C'è qualche differenza tra questi due tipi? Ci sono implicazioni sull'uso dell'uno sull'altro? Quale di questi è più flessibile?dinamico rispetto al tipo di oggetto

risposta

35

Sono enormemente diverso.

Se si utilizza dynamic, si sta optando per la digitazione dinamica e, quindi, per la maggior parte si è scelto di eseguire il controllo in fase di compilazione. E sì, è meno performante rispetto all'utilizzo della tipizzazione statica in cui è possibile utilizzare digitando staticamente.

Tuttavia, non è possibile fare molto con il tipo object - non ha quasi membri. Dove ti ritrovi ad usarlo? Quando si desidera scrivere un codice per scopi generici che può funzionare con una varietà di tipi, si dovrebbe considerare generici anziché object.

+0

Se Luke ha appena chiamato la manciata di metodi disponibili in 'System.Object', sarebbero chiamati anche dinamicamente? –

+2

@Steven: Sì, lo è anche per 'GetType', che non è virtuale! (È possibile impostare un delegato per rispondere alle chiamate 'GetType' su 'ExpandoObject', ad esempio. Roba da paura.) –

+0

Questo è ciò di cui avevo paura. Sembra che avremmo bisogno di "inscatolare" un 'dynamic' tramite upcasting su' object' se vogliamo anche sapere la verità sul suo tipo. :-) –

3

Con l'avanzamento in linguaggio C# abbiamo vedere che anche var tipo è paragonabile a dinamica e oggetto tipi. Qui ci sono tutti i 3 tipi come ho imparato confrontando questi 7 punti:

Object

  1. oggetto è stato introdotto con C# 1.0.
  2. Può memorizzare qualsiasi tipo di valore, perché l'oggetto è la classe base di tutti i tipi in .NET framework.
  3. Il compilatore ha poche informazioni sul tipo.
  4. Il tipo di oggetto può essere passato come argomento del metodo e il metodo può anche restituire il tipo di oggetto.
  5. È necessario eseguire il cast della variabile oggetto sul tipo originale per usarlo e eseguire le operazioni desiderate.
  6. Causa il problema in fase di esecuzione se il valore memorizzato non viene convertito nel tipo di dati sottostante.
  7. Utile quando non disponiamo di ulteriori informazioni sul tipo di dati.

Var

  1. Var è stato introdotto con C# 3.0
  2. E 'possibile memorizzare qualsiasi tipo di valore, ma è obbligatorio per inizializzare tipi var al momento della dichiarazione.
  3. È sicuro dal tipo, ad esempio il compilatore ha tutte le informazioni sul valore memorizzato, in modo che non causi alcun problema in fase di esecuzione.
  4. Il tipo di var non può essere passato come argomento del metodo e il metodo non può restituire il tipo di oggetto. Il tipo di var lavora nello scope in cui è definito.
  5. Non è necessario eseguire il cast perché il compilatore ha tutte le informazioni per eseguire le operazioni.
  6. Non causa problemi poiché il compilatore ha tutte le informazioni sul valore memorizzato.
  7. Utile quando non conosciamo il tipo effettivo, ad esempio il tipo è anonimo.

dinamica

  1. dinamica è stata introdotta con C# 4.0
  2. E 'possibile memorizzare qualsiasi tipo di variabile, simile alla variabile linguaggio VB vecchio.
  3. Non è sicuro dal tipo, ad esempio il compilatore non ha informazioni sul tipo di variabile.
  4. Il tipo dinamico può essere passato come argomento del metodo e il metodo può anche restituire il tipo dinamico.
  5. La trasmissione non è necessaria ma è necessario conoscere le proprietà e i metodi relativi al tipo memorizzato.
  6. Causa problema se si accede alle proprietà o ai metodi errati poiché tutte le informazioni sul valore memorizzato vengono risolte solo in fase di esecuzione.
  7. Utile quando è necessario codificare utilizzando le lingue di riflessione o dinamiche o con gli oggetti COM, poiché è necessario scrivere meno codice.

Speriamo che questo possa aiutare qualcuno.

Grazie!

+1

È a mia conoscenza che var non è affatto un tipo, ma solo implicitamente decide il tipo in base al valore inizializzato. Ad esempio: var x = 2; x NON è un tipo var, è un tipo int. – Nanomurf

0

In un linguaggio semplice:
Assumere web hanno il seguente metodo:

public static void ConsoleWrite(string inputArg) 
{ 
    Console.WriteLine(inputArg); 
} 

Oggetto: il seguente codice ha compilazione errore a meno oggetto cast stringa:

public static void Main(string[] args) 
{ 
    object obj = "String Sample"; 
    ConsoleWrite(obj);// compile error 
    ConsoleWrite((string)obj); 
    Console.ReadKey(); 
} 

dinamica : il seguente codice viene compilato correttamente ma se contiene un valore eccetto string genera Runtime err o

public static void Main(string[] args) 
{ 
    dynamic dyn = "String Sample"; 
    ConsoleWrite(dyn); 
    dyn = 1; 
    ConsoleWrite(dyn);// Runtime Error 
    Console.ReadKey(); 
} 
Problemi correlati