February 2008 - Artículos

Una de las características más útiles que ofrece Visual Studio 2008, conocida en inglés como multi-targeting, es la posibilidad de desarrollar aplicaciones que luego puedan ser desplegadas sobre .NET Framework 2.0, .NET Framework 3.0 ó .NET Framework 3.5. En relación con esto, surge una pregunta interesante: ¿puedo utilizar las nuevas características del lenguaje C# 3.0 en proyectos que vayan a ser desplegados sobre .NET 2.0 o .NET 3.0?

La respuesta es *SI*, en el caso de las características del lenguaje que no dependan de librerías específicas de .NET 3.5. Se pueden utilizar sin problemas la inferencia de tipo de variables locales, las variables implementadas automáticamente, los métodos extensores, los métodos parciales y las expresiones lambda. Dos características, los árboles de expresiones y las consultas integradas (LINQ) *NO* se pueden utilizar, al menos inmediatamente, porque dependen de clases pertenecientes al ensamblado System.Core.dll, que es nuevo en la versión 3.5.

Con respecto a LINQ, sabemos que la sintaxis de consultas integradas se traduce en una cascada de llamadas a los operadores Where(), OrderBy(), etc., y es de la ausencia de éstos de lo que se queja el compilador. Si ponemos nosotros el proveedor de LINQ, las consultas compilarán y ejecutarán correctamente (al menos en el caso de las consultas contra fuentes en memoria; aquí influye también el hecho de que IEnumerable<T> ya existía en .NET 2.0).

Por ejemplo, cree en VS2008 una aplicación de consola para .NET 2.0 y agregue al proyecto nuestro proveedor "desde cero" ClaseLinq<T> (en DEMO3 del post anterior). Dentro del espacio de nombres en el que esa clase está programada, añada las siguientes definiciones de delegados, utilizados por el proveedor, que formalmente también aparecieron en la versión 3.5:

    public delegate TResult Func<TResult>();

    public delegate TResult Func<T, TResult>(T arg);     public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);

 Por último, asigne el siguiente código al método Program.Main():

    var lista = new ClaseLinq<int> { 1, 2, 3, 4, 5, 6 };

    // los cuadrados de los pares

    var q = from n in lista

            where n % 2 == 0

            select n * n;

    foreach (var n in q)

        Console.WriteLine(n);

    Console.ReadLine();

El programa compilará perfectamente y se ejecutará correctamente al ser desplegado sobre un equipo con .NET 2.0.

 

Publicado por Octavio Hernández | 4 comment(s)
Archivado en:

Aún frescas en nuestras memorias las imágenes de TechDays 2008, aprovecho para colgar las demos de mi presentación, y de paso para dar las gracias a todos los que asistieron a ella. La URL para la descarga es:

http://geeks.ms/files/folders/ohernandez/entry75286.aspx

Señalamientos:

  • En la DEMO0, seguramente tendrá que cambiar la cadena de conexión a la base de datos (que sí se incluye en la descarga) para ejecutar el ejemplo de LINQ to SQL y LINQ to Entities.
  • Para visualizar el modelo de ADO.NET Entity Framework en Visual Studio y ejecutar la demo, necesitará:
  • Para ejecutar la DEMO3 (LINQ to TFS), deberá descargar la máquina virtual de evaluación de TFS. Para autenticarse, deberá utilizar el nombre de usuario 'TFSSTORE' y la contraseña 'P2ssw0rd' (OJO: la máquina virtual viene configurada con el teclado en inglés Smile):

La presentación en sí (PPTX) no se incluye en la descarga.

Publicado por Octavio Hernández | 10 comment(s)
Archivado en:

Un año más, Microsoft  España ha tenido a bien confiarme la presentación sobre LINQ en su evento más importante del año, en este caso TechDays 2008. Aprovecho para manifestar desde aquí  mi gratitud por la confianza depositada en mi persona, y decir lo que puede sonar a tópico, que intentaré hacerlo lo mejor posible. Será el día 26 en la sala París del Palacio Municipal de Congresos, a las 14:00 horas.

El objetivo de este post es delinear las líneas generales de la presentación e indicar de qué se hablará y de qué no se hablará allí, dados el limitado tiempo disponible y la gran cantidad de contenido relacionado con LINQ, de manera que los asistentes potenciales tengan una idea bastante clara de lo que pueden esperar de la conferencia e incluso puedan familiarizarse de  antemano con lo que podríamos llamar “prerrequisitos” para comprender los temas que allí se tratarán.

Las observaciones que quería hacer al respecto son:

·         Como el nombre de la conferencia, “LINQ en profundidad”, indica, no se trata de una presentación general o introductoria del tema. Por lo tanto, aunque se presentará la sintaxis de las consultas integradas y su traducción a operadores de consulta estándar, no perderé tiempo en describir:

o   los recursos de C# 2.0 y VB 8.0 (genéricos, iteradores, métodos anónimos) sobre cuya base se apoyan las consultas integradas;

o   las novedades de C# 3.0 y VB 9.0 que hacen factible la sintaxis de las consultas.

Sobre estas características ya hemos hablado tanto yo como otros colegas en múltiples ocasiones anteriores. El lector interesado en familiarizarse o profundizar en esos temas puede referirse a mi libro (capítulos 2 al 8), o a una serie de artículos publicados en dotNetManía a partir de mayo de 2006. Pero también encontrará múltiples fuentes de información gratuita y en castellano en la Web; en particular, José M. Aguilar y José M. Alarcón han descrito algunas de las nuevas características en este mismo sitio Web; yo también he publicado algunos artículos sobre ellas en la Web de “El Guille”. Si utiliza usted Visual Basic,  “El Guille” describe de manera genial todas las novedades de VB 9.0 aquí.

·         El “foco” de la presentación estará centrado en la arquitectura abierta de LINQ y la posibilidad de extender el uso de las consultas integradas a nuevos tipos de datos y APIs; aquí la fuente de información principal que puedo recomendar es nuevamente mi libro (fundamentalmente, el capítulo 10), y artículos disponibles en la Web que describen la activación de clases para LINQ o la implementación de proveedores especializados como:

o   Mi artículo sobre LINQ to Pipes, en MSDN C# Developer Center.

o   La serie de posts de Matt Warren sobre la creación de proveedores basados en IQueryable<T>.

o   Posts sobre la implementación de LINQ to Amazon.

o   Posts sobre la implementación de LINQ to LDAP.

·         Aunque resumiré las principales características de los proveedores “predefinidos” en .NET Framework 3.5 (LINQ to Objects, LINQ to XML y LINQ to SQL) y presentaré demos sobre ellos, no serán el foco principal de la presentación. De nuevo, los capítulos correspondientes de mi libro (capítulos 9, 10 y 12 al 14) o los artículos de dotNetManía podrían servir como introducción a esos temas.

·         También pretendo (si el tiempo lo permite), resumir las ideas centrales y hacer una pequeña demo sobre LINQ to Entities, pero la exposición del tema necesariamente tampoco podrá ir mucho más allá. Tenga en cuenta además que en paralelo con la mía se estará produciendo otra sesión (en la sala Madrid) que tratará específicamente sobre ADO.NET Entity Framework (dura competenciaJ).

·         Los ejemplos que se presentarán durante las demos estarán escritos en C#, aunque prácticamente todo lo dicho será aplicable a Visual Basic.

Y eso, creo, es todo lo que quería comentar aquí. ¡Nos vemos en TechDays 2008!

 

 

Publicado por Octavio Hernández | 21 comment(s)
Archivado en: ,

Una vez salidos al mercado .NET 3.5 y C# 3.0, el equipo de desarrollo ya ha comenzado a pensar en las nuevas características a incorporar al lenguaje en la próxima "ola". Para mantener al tanto a la comunidad, Charlie Calvert, Community PM de C#, ha dado inicio a una serie de posts que bajo el título "Future focus" comenzará a presentar ideas a ese respecto...

La primera propuesta, que ha causado bastante revuelo (según puede verse en la página antes mencionada), está relacionada con la adición a C# de enlace dinámico o tardío (dynamic / late binding), mediante el cual el acceso a una propiedad, método u otra característica de un objeto no se comprueba en tiempo de compilación, sino que es en tiempo de ejecución cuando se verifica si realmente el objeto soporta dicha propiedad o método, para llamarlo en caso afirmativo (o producir un error de ejecución si no existe).

El objetivo central de incluir esta especie de Option Strict Off :-) en C# es, en principio, hacer posible que se escriban en C# aplicaciones para el futuro Dynamic Language Runtime (DLR) que se montará por encima del CLR y jugará un papel importante en la próxima versión de Silverlight, haciendo posible desarrollar, además de VB, en Ruby, Python y otros lenguajes dinámicos. Otra área en las que el soporte de búsqueda dinámica de miembros puede ser útil es la automatización de Office y otros escenarios de interoperabilidad con COM; en este sentido, la adición de esta característica me recuerda lo que ocurrió hace alrededor de una década con Delphi, hasta entonces un lenguaje "puro" en lo que a control estricto de tipos se refiere.

La sintaxis que se propone (solo un esbozo, según los autores; de hecho, la impresión que me da es que no pensaron mucho en la idea antes de lanzarla al éter) es como sigue:

static void Main(string[] args)
{
    dynamic
    {
        object myDynamicObject = GetDynamicObject();
        myDynamicObject.SomeMethod();         // call a method   
        myDynamicObject.someString = "value"; // Set a field
        myDynamicObject[0] = 25;              // Access an indexer
    }
}

La idea es que todo el código situado dentro del bloque dynamic podría hacer uso del enlace dinámico.

No repetiré aquí lo que dije allí, pero honestamente no me gusta la sintaxis que se plantea. Incluso se me antoja que nuestro querido lenguaje podría estropearse para siempre...

 

Publicado por Octavio Hernández | 11 comment(s)
Archivado en:

Ha sido publicado un artículo mío en el Visual C# Developer Center:

Applying LINQ to New Data Types

Es una primera contribución sobre cómo habilitar para LINQ diferentes fuentes de datos, en este caso los provenientes de una canalización con nombre (named pipe).

Publicado por Octavio Hernández | 13 comment(s)
Archivado en: ,