Tipo dinámico en C#

1 - Qué es el tipo dinámico

Como sabemos del post de los tipos anónimos, C# o .net implementa un tipo llamado dynamic o dinámico el cual, como su propio nombre indica nos permite asignarle un valor de forma dinámica. 

Como sabemos, cuando creamos una variable debemos indicar el tipo de variable que va a ser, o podemos utilizar la palabra clave var, la cual se convertirá en tiempo de compilación en el tipo de variable - la cual denominamos variable implícita -

En el caso de las variables dinámicas, en vez de determinar su valor en tiempo de compilación se determina durante el tiempo de ejecución, o runtime

 

2 - Uso de un tipo dinámico en programación

Para declarar una variable dinámica es tan fácil como indicar la palabra clave dynamic el nombre de la variable y su asignación.

dynamic variableTest = 1;

Del mismo modo, podemos asignar un valor de  un string o de cualquier otro tipo, como podemos observar.

dynamic variableTest = 1;
variableTest = “test”;

Cuando el compilador pasa por la variable lo que hace es convertir en tipo en un tipo Object en la gran mayoría de los casos. 

Lo que quiere decir que cada vez que le asignamos un valor, cambiará también el tipo de variable que es el objeto, podemos verlo utilizando la siguiente línea de código:

dynamicVariable.GetType().ToString();

 

3 - Riesgos de utilizar el tipo dinámico

Cuando programamos con el tipo dinámico, el compilador no nos va a indicar si estamos llamando a un método que vaya a recibir ese tipo concreto, ni siquiera si intentamos acceder a una de sus propiedades nos indicará si lo estamos haciendo de forma correcta. 

Y esto qué quiere decir, pues que del mismo modo que el compilador no nos va a indicar que es erróneo podemos introducir errores en nuestro código, los cuales nos saldrán en tiempo de ejecución o runtime. 

Para mostrar un caso, en el ejemplo anterior tenemos la variable ejemploTest, la cual llegados a este punto es un string, pues podemos invocar o tratar de invocar una propiedad, por ejemplo .valor. como vemos el compilador no nos da error, pero cuando lo ejecutamos nos salta una excepcion de que el tipo string no contiene una propiedad llamada valor.

Console.WriteLine(variableTest.Valor);

Si ejecutamos el ejemplo, veremos cómo el compilador nos lanza una excepción

 

4 - Crear métodos que reciben tipos dinámicos.

Por el mismo motivo que acabamos de ver, cuando indicamos que el tipo que pasamos a un método es dinámico, este aceptara cualquier tipo de objeto que mandemos, no únicamente los dinámicos. 

Pero lo dicho, debemos tener cuidado cuando accedemos a sus propiedades. 

 

5 - Cuándo utilizar tipos dinámicos

Bueno aquí llega la parte más peliaguda, ya que visto lo anterior parece un poco complicado, al menos de evitar errores, o un “porque voy a utilizar un tipo dynamic cuándo puedo utilizar el propio tipo”

Hay que tener en consideración que así como tiene beneficios tiene contras, por lo que no debemos utilizarlo todo el tiempo como si de javaScript se tratara. 

Por lo que algunos de los casos que utilizaremos dynamic son los siguientes

  • Cuando estamos creando código que se va a comunicar con otro lenguaje de programación.
  • Así como librerías para múltiples lenguajes.
  • Cuando estamos creando objetos o métodos y nos da igual qué tipo venga de entrada.
  • Hacer soluciones genéricas.
  • Facilita y simplifica el trabajar con reflection, que veremos más adelante. 

Y las pegas o contras que podemos encontrar  son las siguientes: 

  • Es notablemente más lento que cuando trabajamos con tipos estáticos.
  • Aumenta la probabilidad de fallo, en tiempo de ejecución.
  • Intellisense no nos detecta ni los métodos ni las propiedades, por lo que puede ser un poco difícil trabajar con ellos