2010-08-12 12 views
7

¿Cuál es la diferencia entre una variable declarada como dinámica y una variable declarada como System.Object? Ejecución de la siguiente función parecería indicar que ambas variables consiguen convierte en el tipo correcto de forma dinámica:Diferencia entre el objeto dinámico y System.Object

void ObjectTest() 
{ 
    System.Object MyTestVar = "test"; 
    dynamic MyTestVar2 = "Testing 123"; 

    Console.WriteLine("{0}", MyTestVar.GetType()); 
    Console.WriteLine("{0}", MyTestVar2.GetType()); 

    MyTestVar = 123; 
    MyTestVar2 = 321; 

    Console.WriteLine("{0}", MyTestVar.GetType()); 
    Console.WriteLine("{0}", MyTestVar2.GetType()); 
} 
+1

escribí una publicación sobre esto hace algún tiempo: http://blogs.msdn.com/b/csharpfaq/archive/2010/01/25/what-is-the-difference-between-dynamic-and-object -keywords.aspx –

Respuesta

6

La diferencia es que MyTestVar2.ToUpper() compila y obras, sin ningún tipo de conversión explícita.

object es un tipo normal.
dynamic es básicamente un tipo de marcador de posición que provoca que el compilador emita llamadas dinámicas con destino tardío.

GetType() es una función normal definido por la clase object que opera en el ejemplo que llame a encenderlo.
GetType() no se ve afectado por el tipo declarado de una variable que hace referencia al objeto que lo llama. (excepto para elementos nulables)

+0

¿entonces lo que está diciendo es que puede llamar a métodos específicos de objeto en variables dinámicas? – Icemanind

+2

Puedes llamar a _any_ method en variables 'dynamic'. El código 'dinámico x = 3; x.Explode(); 'compilará perfectamente bien – SLaks

1

Probablemente debería comenzar con este excelente MSDN article. Las diferencias pueden resumirse bastante sucintamente:

En tiempo de compilación, un elemento que es escribe como dinámico se supone para apoyar cualquier operación.

System.Object sólo tiene un puñado de operaciones que apoya - ToString(), Equals(), etc.

1

La diferencia fundamental es tiempo de compilación (por objeto) vs tiempo de ejecución (por dinámica) resoulution de llamadas. También se llama unión temprana versus tardía. [Nota: añadir una referencia a Microsoft.CSharp el siguiente código para compilar.]

object o = "Hello world";// fine because a derived type can be assigned to a base type 
    dynamic d= "Hello world";// fine as well 

    Type otype=o.GetType();// compiles because it confirms that object has a GetType() 
    Type dtype=d.GetType();// also compiles but for another reason (i.e.no binding yet) 

    string upperd= d.ToUpper(); // compiles because no binding yet (anything goes :) 
    string uppero= o.ToUpper(); // Fails to compile. Object has no ToUpper() method 

Si en comentario la última llamada, la aplicación debería funcionar bien porque el CLR, cuando llega a la segunda llamada última d .ToUpper() en tiempo de ejecución, buscará un método ToUpper() en el tipo de cadena y lo encontrará allí (porque en la segunda instrucción d se le asignó una cadena). La última llamada no se compiló porque ToUpper() se estaba buscando en el tipo System.Object en el momento de la compilación, que por supuesto no estará allí.

Cuestiones relacionadas