"Con Dynamic, puedes 'apagar' efectivamente el verificador de tipo C# y simplemente decir: 'Sé lo que estoy haciendo, ¡déjame hacerlo!' Esto permite un código más simple al interactuar con lenguajes dinámicos o API COM"
--Anders Hejlsberg
Recientemente profundicé en las nuevas características introducidas en C# 4.0 y quedé particularmente impresionado por la inclusión de la palabra clave dynamic. Esta adición representa un avance significativo en el lenguaje, ya que permite aplazar la evaluación de tipos hasta el tiempo de ejecución. En consecuencia, los errores de asignación de tipos no se detectan en tiempo de compilación sino en tiempo de ejecución, lo que ofrece una herramienta potente y flexible para los desarrolladores.
La palabra clave dynamic indica al compilador que omita la verificación de tipos en el momento de la compilación. Esta característica está bien documentada en un artículo de MSDN, que proporciona una clara diferenciación entre objeto, var y dynamic:
- var: permite la inferencia de tipos, pero los errores de asignación de tipos se detectan en el momento de la compilación.
- objeto: el tipo base para todos los objetos .NET, que requiere una conversión explícita para evitar errores de compilación.
- dynamic: pospone la detección de errores de asignación de tipos hasta el tiempo de ejecución, lo que hace que el código sea más flexible pero también introduce posibles errores de tiempo de ejecución.
Desde la perspectiva de un desarrollador, particularmente en escenarios que involucran interoperabilidad y manipulación de tipos dinámicos, dynamic es increíblemente beneficiosa. A continuación se muestran algunos casos de uso clave que resaltan su practicidad:
Interoperabilidad con otros lenguajes o marcos
Sin dynamic, acceder a métodos de un objeto o ensamblado desde otro lenguaje o marco requeriría reflexión, como se muestra a continuación:
object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 });
int sum = Convert.ToInt32(res);
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);
Agregar métodos dinámicamente a objetos
La palabra clave dynamic, combinada con el objeto ExpandoObject, permite agregar métodos y propiedades en tiempo de ejecución, mejorando la flexibilidad y reduciendo el código repetitivo:
dynamic expando = new ExpandoObject();
expando.SampleProperty = "This property was added at run time";
expando.SampleMethod = (Action)(() => Console.WriteLine(expando.SampleProperty));
expando.SampleMethod();
Interoperabilidad COM simplificada
Uno de los objetivos de Microsoft con dynamic y DLR (Dynamic Language Runtime) era simplificar la interoperabilidad COM, particularmente con aplicaciones de Office. Aquí hay un ejemplo que ilustra esta mejora. Se trata de un código que pretende agregar un valor a la primera celda de una hoja de cálculo de Excel y luego aplicar el método AutoFit a la primera columna.
Antes en C# 3.0 se debia hacer esto:
// Add this line to the beginning of the file:
// using Excel = Microsoft.Office.Interop.Excel;
var excelApp = new Excel.Application();
excelApp.Workbooks.Add(Type.Missing);
excelApp.Visible = true;
Excel.Range targetRange = excelApp.get_Range("A1", Type.Missing);
targetRange.set_Value(Type.Missing, "Name");
((Excel.Range)targetRange.Columns[1, Type.Missing]).AutoFit();
Ahora, es más claro, lograr lo mismo:
// Add this line to the beginning of the file:
// using Excel = Microsoft.Office.Interop.Excel;
var excelApp = new Excel.Application();
excelApp.Workbooks.Add();
excelApp.Visible = true;
Excel.Range targetRange = excelApp.Range["A1"];
targetRange.Value = "Name";
targetRange.Columns[1].AutoFit();
Lo interesante de este ejemplo es que no se puede ver la palabra clave dynamic en ninguna parte del código, sin embargo, el concepto dinámico es usado por C# 4.
En la versión C# 3.0, targetRange.Columns[1, Type.Missing] devuelve un objeto y es por eso que es necesaria la conversión a Excel.Range. Pero en C# 4 dichas llamadas se convierten silenciosamente en dinámicas. Entonces, el tipo de targetRange.Columns[1] en C# 4 es en realidad dinámico.
¡Gracias por llegar hasta aquí!
Espero que hayas encontrado este artículo útil y enriquecedor. Si consideras que esta información puede ser valiosa para tus contactos, te invito a compartirla en tus redes sociales. Tu apoyo me ayuda a llegar a más personas y a continuar ofreciendo contenido de calidad.
Si tienes alguna duda o comentario, estaré encantado de escucharte. Puedes ponerte en contacto conmigo directamente a través del mecanismo de contacto. Estaré atento a tus mensajes y responderé a la brevedad posible.
¡Gracias por tu apoyo y confianza!