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!

No hay comentarios: