miércoles, 26 de marzo de 2008

Mejoras en los lenguajes C# y VB: Metodos de Extension

Agregando funcionalidad a tipos
De manera tradicional en el desarrollo orientado a objetos si uno quiere agregar nueva funcionalidad a una clase utiliza herencia para especializar la clase derivada; sin embargo si las clases son marcadas como NotInheritable en VB o como sealed en C# esto no es posible.

Las nuevas versiones de C# y VB dentro del ultimo release de .NET Framework 3.5 y Visual Studio 2008 incluyen una nueva característica que me ha llamado la atención, la cual corresponde al titulo de este articulo, los metodos de extensión o extension methods en inglés.


Que son los métodos de Extensión
Bien como el nombre sugiere son métodos que extienden la funcionalidad de un tipo existente, pero con la particularidad de que no modifican el tipo original y pueden ser llamados como metodos de instancia regulares.

Esta implementación no es propia de la orientación a objetos, sino del .NET framework y fue necesaria como parte del soporte de C# y VB para implementar LINQ.

Beneficios
Dicho lo anterior, ahora podemos extender cualquier tipo existente del .NET Framework (valor,referencia e interfaces), pero no debe abusarse de esta característica y la sugerencia es que utilizes los metodos de extension cuando las vias tradicionales no puedan ser usadas.

Ademas en Visual Studio 2008 al llamar a estos metodos tenemos la ventaja de poder usar Intellisense y estan representados ligeramente diferentes al momento de mostrar la lista de metodos y las funcionalidades Goto,Definition etc para estos metodos dentro del IDE operan como para cualquier otro metodo de instancia.


Las extensiones para LINQ
Por ejemplo para implementar LINQ sobre los lenguajes C# y VB, se crearon nuevos metodos sobre la interfaz IEnumerable(T), de tal forma que cualquier clase que implemente esta interfaz o cualquier clase derivada de esta interfaz es posible utilizarla para realizar una consulta LINQ.


Consideraciones
En el caso de Visual Basic, los metodos de extension deben ser declarados dentro de Modulos ya sea como subrutinas o funciones esto beneficia en el diseño ya que los modulos no participan en herencia y no existe el concepto de modulos parciales.
Internamente se realiza una llamada a un metodo shared por el compilador al usar el metodo de extension.
Para C# los metodos deben ser declarados dentro de una clase como cualquier otro tipo pero esta debe ser estatica.

Ademas existe gran interoperabilidad con los metodos de extension ya que pueden escribirlos en C# y consumirlos en un tipo de VB.NET o viceversa.


Usando Metodos de Extension en las versiones del .NET Framework

Una nueva característica de Visual Studio 2008 es la llamada "multi-targeting", la cual nos provee la flexibilidad de crear nuestros proyectos en la version del framework que requiramos,y ya que los metodos de extension estan estrechamente integrados con el compilador, estos puedes ser usados por cualquier version de Framework que Visual Studio 2008 soporte.

Ejemplo
Ahora veamos un ejemplo sencillo, extendiendo la funcionalidad de la clase String:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyCustomExtension;

namespace SampleApp
{
class Program
{
static void Main(string[] args){
Console.WriteLine("Usando metodos de extension");
String myString = "Cadena de Ejemplo";
myString.printString2Console();
Console.ReadLine();
}
}
}
namespace MyCustomExtension{
public static class Utils{

public static void printString2Console(this string s){
Console.WriteLine('*'+s+'*');
}
}
}
-------------------------------------------------------------------------------------
Como podran observar el metodo printString2Console simplemente imprime la cadena en la consola agregandole un asterisco al principio y al final.
Observen la palabra reservada this la cual corresponde al primer paametro del metodo, en este caso el unico. Como regla en C# al declarar un metodos de extension, se debe anteponer la palabra this y el primer parametro corresponderá al tipo sobre el cual aplicará la nueva funcionalidad.
El metodo printString2Console esta disponible como un metodo de extension dentro del IDE como podemos apreciar a través del Intellisense.
Aqui se ha declarado el metodo para una clase utils dentro de otro namespace MyCustomExtension.
Este namespace podría estar dentro de otro assembly y nos permitirá agregar la nueva funcionalidad sin necesidad de recompilar el assembly del tipo que estamos extendiendo.

Bien espero que esta post les ayude a comprender mejor el uso de los metodos de extension y lo conveniente que puede resultar para mejorar cualquier tipo del .NET Framework.

Saludos!

Webcast LINQ to Objects

Aquí les dejo un webcast con el demo de LINQ to Objects que vimos en la reunión de Marzo en la comunidad Aluxes.NET, espero que sea de utilidad para ustedes y espero su retroalimentación ya que me estoy iniciando en esto de los webcast y cualquier comentario para mejorarlos será de gran ayuda para ofrecerles contenido de calidad.

Aqui está el webcast:



De todos modos le dejo el enlace desde donde pueden descargar el webcast y en este otro pueden descargar el codigo fuente.

Saludos!

lunes, 17 de marzo de 2008

Resumen de la reunión del mes de Marzo

Hola!

Bueno para los que no pudieron asistir a la ultima reunión de la comunidad Aluxes.NET, estuvimos platicando acerca de la tecnología LINQ, la cual es uno de los elementos principales de la nueva version de .NET Framework 3.5, puedes ver la presentación a continuación:

Teniamos programada una platica acerca de calidad de software pero está quedara pendiente hasta nuevo aviso.

Como es costumbre realizamos una rifa de algunos regalos entre los aistentes donde se obsequiaron versiones de Visual Web Developer Express.

Por lo pronto ya estamos preparando el evento de lanzamiento de Visual Studio 2008 y SQL 2008, para que conozcas cuales son las ultimas características y ventajas de estas importantes herramientas de nuestro trabajo diario.

No olvides registrarte para el evento, en la página de la comunidad tenemos el link para el registro.

Saludos!