2010-08-09 13 views

Respuesta

35

Son enormemente diferente.

Si usa dynamic, opta por el tipado dinámico y, por lo tanto, opta por la verificación en tiempo de compilación en su mayor parte. Y sí, es menos eficiente que usar el tipado estático donde puede usar tipado estático.

Sin embargo, no se puede hacer mucho con el tipo object de todos modos, apenas tiene miembros. ¿Dónde te encuentras usándolo? Cuando desee escribir un código de propósito general que pueda funcionar con una variedad de tipos, generalmente debería considerar los genéricos en lugar de object.

+0

Si Luke acaba de llamar al puñado de métodos disponibles en 'System.Object', ¿también se llamarían dinámicamente? –

+2

@Steven: Sí, lo hace, ¡incluso para 'GetType' que no es virtual! (Puede configurar un delegado para que reaccione a las llamadas de 'GetType' en' ExpandoObject', por ejemplo. Cosas de miedo.) –

+0

Eso es lo que temía. Parece que tendríamos que "encajonar" una 'dinámica' mediante upcasting en 'objeto' si queremos saber la verdad sobre su tipo. :-) –

3

Con el avance en el lenguaje C# hemos ver que incluso var tipo es comparable a dinámica y objeto tipos. Aquí son los 3 tipos como he aprendido mediante la comparación de estos 7 puntos:

objeto

  1. objeto se introdujo con C# 1.0.
  2. Puede almacenar cualquier tipo de valor, porque object es la clase base de todo tipo en .NET framework.
  3. El compilador tiene poca información sobre el tipo.
  4. El tipo de objeto se puede pasar como argumento de método y el método también puede devolver el tipo de objeto.
  5. Necesita convertir el objeto variable al tipo original para usarlo y realizar las operaciones deseadas.
  6. Causa el problema en el tiempo de ejecución si el valor almacenado no se convierte al tipo de datos subyacente.
  7. Útil cuando no tenemos más información sobre el tipo de datos.

Var

  1. Var se introdujo con C# 3.0
  2. Es capaz de almacenar cualquier tipo de valor, pero es obligatoria para inicializar tipos var en el momento de la declaración.
  3. Es tipo seguro, es decir, el compilador tiene toda la información sobre el valor almacenado, por lo que no causa ningún problema en tiempo de ejecución.
  4. El tipo Var no se puede pasar como argumento de método y el método no puede devolver el tipo de objeto. Var escribe el trabajo en el ámbito donde está definido.
  5. No es necesario realizar el colado porque el compilador tiene toda la información para realizar operaciones.
  6. No causa problemas porque el compilador tiene toda la información sobre el valor almacenado.
  7. Útil cuando no conocemos el tipo real, es decir, el tipo es anónimo.

dinámico

  1. dinámico se introdujo con C# 4.0
  2. Se puede almacenar cualquier tipo de variable, similar a la variable de idioma VB edad.
  3. No es un tipo seguro, es decir, el compilador no tiene ninguna información sobre el tipo de variable.
  4. El tipo dinámico se puede pasar como método y el método también puede devolver el tipo dinámico.
  5. No es necesario el colado, pero debe conocer las propiedades y los métodos relacionados con el tipo almacenado.
  6. Causa un problema si se accede a las propiedades o métodos incorrectos porque toda la información sobre el valor almacenado es obtener resolución solo en tiempo de ejecución.
  7. Útil cuando necesitamos codificar usando reflexión o lenguajes dinámicos o con los objetos COM, porque necesita escribir menos código.

Espero que esto ayude a alguien.

Gracias!

+1

Tengo entendido que var no es un tipo en absoluto; simplemente decide implícitamente el tipo en función del valor inicializado. Por ejemplo: var x = 2; x NO es un tipo var, es un tipo int. – Nanomurf

0

En lenguaje sencillo:
Supongamos web tienen el siguiente método:

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

objeto: el siguiente código tiene compilar errores a no ser objeto colado a cadena:

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

dinámica : el siguiente código se compila correctamente pero si contiene un valor excepto string arroja Runtime err o

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