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
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
.
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
- oggetto è stato introdotto con C# 1.0.
- Può memorizzare qualsiasi tipo di valore, perché l'oggetto è la classe base di tutti i tipi in .NET framework.
- Il compilatore ha poche informazioni sul tipo.
- Il tipo di oggetto può essere passato come argomento del metodo e il metodo può anche restituire il tipo di oggetto.
- È necessario eseguire il cast della variabile oggetto sul tipo originale per usarlo e eseguire le operazioni desiderate.
- Causa il problema in fase di esecuzione se il valore memorizzato non viene convertito nel tipo di dati sottostante.
- Utile quando non disponiamo di ulteriori informazioni sul tipo di dati.
Var
- Var è stato introdotto con C# 3.0
- E 'possibile memorizzare qualsiasi tipo di valore, ma è obbligatorio per inizializzare tipi var al momento della dichiarazione.
- È 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.
- 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.
- Non è necessario eseguire il cast perché il compilatore ha tutte le informazioni per eseguire le operazioni.
- Non causa problemi poiché il compilatore ha tutte le informazioni sul valore memorizzato.
- Utile quando non conosciamo il tipo effettivo, ad esempio il tipo è anonimo.
dinamica
- dinamica è stata introdotta con C# 4.0
- E 'possibile memorizzare qualsiasi tipo di variabile, simile alla variabile linguaggio VB vecchio.
- Non è sicuro dal tipo, ad esempio il compilatore non ha informazioni sul tipo di variabile.
- Il tipo dinamico può essere passato come argomento del metodo e il metodo può anche restituire il tipo dinamico.
- La trasmissione non è necessaria ma è necessario conoscere le proprietà e i metodi relativi al tipo memorizzato.
- 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.
- 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!
È 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
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();
}
- 1. Vista fortemente digitata rispetto alla visualizzazione con tipo dinamico
- 2. come lanciare in modo dinamico un oggetto di tipo stringa in un oggetto di tipo T
- 3. Come ottenere il tipo di un oggetto dinamico in C#?
- 4. Come accedere al tipo di oggetto Carbon?
- 5. Definizione di famiglie di tipi personalizzati rispetto al tipo Nat
- 6. fusione statica rispetto dinamico cast
- 7. Linq dinamico - Esegui una query su un oggetto con membri di tipo "dinamico"
- 8. Che è di tipo dinamico dell'oggetto
- 9. Indicizzare un oggetto dinamico utilizzando NEST
- 10. Come trasmettere Oggetto al suo tipo effettivo?
- 11. Conversioni di tipo dinamico C#
- 12. ottenere oggetti di tipo dinamico
- 13. Come creare il proprio tipo dinamico o oggetto dinamico in C#?
- 14. Oggetto dinamico letterale in javascript?
- 15. Stack assegnato agli oggetti RAII rispetto al principio DI
- 16. Corrispondenza del modello rispetto al tipo generico utilizzando il parametro di tipo "flessibile"
- 17. oggetto non corrisponde al tipo di destinazione utilizzando C# Riflessione
- 18. Come aggiungere contenuto al tipo di oggetto stringstream?
- 19. fare riferimento al tipo di oggetto nella definizione dell'oggetto
- 20. Converti stringa in oggetto dinamico
- 21. tipo di ritorno dinamico di una funzione
- 22. Valore predefinito del tipo dinamico?
- 23. tipo dinamico nella visualizzazione MVC
- 24. 'oggetto' non contiene una definizione per dinamico
- 25. DataContract e dinamico tipo di ritorno WCF
- 26. Vantaggio di dire al compilatore Swift il tipo di un oggetto, invece di dedurre?
- 27. Espressione lambda rispetto al metodo
- 28. Quando devo convalidare la presenza di un oggetto di associazione ActiveRecord rispetto al suo id?
- 29. Riquadro di contenimento rispetto al rettangolo
- 30. Vantaggi dell'uso di cql rispetto al parsimonia
Se Luke ha appena chiamato la manciata di metodi disponibili in 'System.Object', sarebbero chiamati anche dinamicamente? –
@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.) –
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. :-) –