Hay 3 tipos "generales" (aunque no todos son tipos reales) en C#: object, var y dynamic.
objeto
Un tipo real, al igual que cualquier otro tipo, con una regla especial: si un tipo no hereda, que hereda de objeto. De esto, se deduce que todos los tipos heredan de objeto, directa o indirectamente.
Énfasis: objeto es un tipo. Un objeto puede ser del tipo objeto, y el tipo tiene sus métodos, como ToString(). Dado que todo hereda de objeto, todo puede ser upcast en objeto. Cuando se asigna un objeto a un objeto de referencia, que está haciendo upcasting al igual que cuando se asigna un tipo de objetoelefante a una referencia Animal donde elefante hereda de animal.
SomeType x = new SomeType();
object obj = x;
obj.DoSomething();
- obj se trata como siendo de tipo objeto en tiempo de compilación, y será de tipo objeto en tiempo de ejecución (que es lógico, ya que es un tipo real - obj está declarada como objeto por lo que sólo puede ser de ese tipo)
- obj.DoSomething() causará un error de tiempo de compilación, como ob ject no tiene este método, independientemente de si SomeType lo tiene.
Var
Esto no es un tipo real, es simplemente la abreviatura de "compilador, averiguar el tipo para mí basado en el lado derecho de la asignación".
SomeType x = new SomeType();
var obj = x;
obj.DoSomething();
- obj es tratado como del tipo SomeType en tiempo de compilación, y será de tipo SomeType en tiempo de ejecución, al igual que si hubiera escrito "SomeType" en lugar de "var" .
- si SomeType tiene un método HacerAlgo(), este código funcionará
- si SomeType no tiene el método, el código causará un error en tiempo de compilación
Dinámico
Este es un tipo que le dice al compilador que deshabilite la verificación del tipo en tiempo de compilación en la variable. Se considera que un objeto tiene el tipo dinámico en tiempo de compilación y tiempo de ejecución.
SomeType x = new SomeType();
dynamic obj = x;
obj.DoSomething();
Esto lanzará una excepción si x es de un tipo que no tiene la método HacerAlgo, pero seguirá siendo posible llamarlo y pasar cualquier objeto como el parámetro sin un error en tiempo de compilación, lo que provoca un error que solo se muestra en el tiempo de ejecución, y posiblemente solo en circunstancias específicas: un posible error. Por lo tanto, si utiliza la dinámica en cualquier clase de interfaz pública de una clase, siempre debe verificar manualmente el tiempo de ejecución utilizando reflectividad, lidiar con excepciones cuidadosamente o no hacerlo en primer lugar.
Nota: el objeto al que se hace referencia nunca cambia su tipo, por supuesto. Mientras obj puede ser objeto, la x que se refiere a es todavía SomeType.
¿por qué necesita almacenar objetos heterogéneos en la misma lista? Sólo curiosidad ... –
debes buscar dinámico vs objeto, mira este hilo, probablemente responda tu respuesta http://stackoverflow.com/questions/3442821/dynamic-vs-object-type – Habib
Tengo una clase donde uno de las propiedades es una colección de elementos relevantes para esa clase que no son del mismo tipo, pero son relevantes como grupo. – Jason