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!

martes, 26 de febrero de 2008

Obteniendo información de una computadora remotamente

Hola!

¿Alguna vez has tenido la necesidad de obtener el nombre de una computadora remotamente?...es una tarea bastante interesante entre otra info. que puedes obtener; de hecho podrias realizar esto simplemente usando el Windows Script Host.

Pero si requieres hacer una tarea mas elaborada digamos auditar el hardware y software de una computadora remota,obtener que version del Sistema Operativo estas usando,etc, entonces es mas recomendable usar el Windows Management Instrumentation.

Anteriormente este servicio tenia que ser instalado de forma separada pero ahora lo interesante es que esta disponible en el .NET framework a través del espacio de nombre System.Management.

En siguiente ejemplo en C# muestra una simple consulta hacia una computadora remota, obtieniendo algunos datos básicos como el tipo de sistema operativo, la versión de éste,el nombre de la PC, entre otros; en este caso tengo privilegios administrativos para acceder a la PC, chequen la documentación para mas opciones.

Hoy en día existen varios programas de auditoría de hardware y software usados en los departamentos de TI, pero siempre es interesante saber como podemos realizar esas tareas.

Espero que este ejemplo les sea de utilidad y lo incluyan en su caja de herramientas de programación.

Saludos!

================================================

using System;

using System.Management; //Para acceder al WMI

namespace RemoteControlApp

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Inicia Programa para acceder a recursos de otra computadora remotamente...");

ConnectionOptions options = new ConnectionOptions();

ManagementScope scope = new ManagementScope("\\\\192.168.17.58\\root\\cimv2",options);

scope.Connect();

//Ahora obteniendo info acerca del OS

ObjectQuery query = new ObjectQuery("select * from Win32_OperatingSystem");

ManagementObjectSearcher wmiSearcher = new ManagementObjectSearcher(scope, query);

ManagementObjectCollection queryWMICollection = wmiSearcher.Get();

foreach (ManagementObject m in queryWMICollection)

{

//Mostrar info de la computadora remota

Console.WriteLine("Nombre de la computadora: {0}", m["csname"]);

Console.WriteLine("Directorio de Windows: {0}", m["WindowsDirectory"]);

Console.WriteLine("Sistema Operativo: {0} {1}", m["Caption"], m["Version"]);

Console.WriteLine("Fabricante: {0}", m["Manufacturer"]);

Console.WriteLine("Termina Programa para acceder a recursos de otra computadora remotamente...");

Console.ReadLine();

}

}

}

}

domingo, 24 de febrero de 2008

Creación de archivos temporales con C#

Los archivos temporales son usados generalmente para manipulación y almacenamiento de datos.
A menudo es necesario guardar datos como preferencias del usuario, información de sesion, log para errores y otros tipos de información.
En este caso usare la clase System.IO.Path y el método GetTempFileName para obtener el nombre del archivo en el directorio temporal del usuario actual. Existen otras enfoques para realizar esta tarea, pero usare este metodo ya que devuelve un nombre único.
Dicho lo anterior por cada llamada al método GetTempFileName se obtendrá un nombre diferente aun cuando no se use para crear fisicamente el archivo, lo cual es conveniente si se estan ejecutando varias instancias de tu aplicación y evitar colisiones.

Veamos como se ve el código:

using System;

using System.IO;

namespace TempFileSampleApp

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Este es un ejemplo de creacion de archivos temporales");

crearArchivoTemp();

}

static void crearArchivoTemp()

{

string curTempFileName="";

curTempFileName = Path.GetTempFileName();

//Ahora creamos fisicamente el archivo

using (StreamWriter sw = File.CreateText(curTempFileName))

{

sw.WriteLine("Primera linea del archivo");

sw.Close();

}

Console.WriteLine("Se ha creado el archivo temporal satisfactoriamente!!");

Console.ReadLine();

}

}

}


Bien espero que este tip te haya sido de utilidad y consulta mi blog frecuentemente ya que estaré publicando mas ejemplos proximamente sobre programación con .NET.
Saludos!

domingo, 17 de febrero de 2008

Taller Gratuito en línea para MCTS exámen 70-536

Si entre tus propositos de año nuevo esta el obtener alguna certificación o si ya estas certificado y quieres reforzar tus conocimientos..aquí tienes una gran oportunidad de tomar un taller para la certificación Microsoft Certified Technology Specialist examen 70-536, que será impartido on-line a través del siguiente link..apurate a inscribirte antes del 3 de Marzo.

Saludos!

jueves, 14 de febrero de 2008

Primera Reunion Comunidad Aluxes.NET

Hola!
El pasado Martes 12 de Febrero se realizó la primera reunión de la comunidad Aluxes.NET, la cual tuvo como objetivo presentar el programa de comunidades Microsoft así como los beneficios y responsabilidades de pertenecer a este programa; los cuales van de la mano con los objetivos de la comunidad.

Entre los puntos importantes de la reunión destacan los siguientes:

Objetivo del Programa

Proveer mecanismos para la creación de profesionales de TI,desarrolladores,diseñadores,etc y fomentar su evolución en redes de conocimiento y negocios.

Beneficios para la comunidad

De manera general fomenta la comunicación y colaboración de diferentes maneras con el gobierno e industria local así como las instituciones educativas; fortaleciendo la industria y motivando a una cultura de mejora continua en todos los niveles.

Operación de la comunidad

Existirá un grupo coordinador el cual tiene las siguientes responsabilidades:

  • Planea y organiza las reuniones de la comunidad
  • Difunde y Comparte sus conocimientos
  • Anuncia activamente las tareas de la comunidad
  • Invita y fomenta la participación de  nuevos miembros
  • Es el enlace entre las comunidades locales y Microsoft

Sobre las comunidades que participan en el programa

  • Las comunidades son organismos de operación independientes de Microsoft.
  • Microsoft apoya a las comunidades directamente o a través de socios de negocios.
  • Se deberá contar con un grupo coordinador y con un director o líder.

Compromisos Microsoft

  • Proveer material de apoyo cada vez que se registre un evento en el portal de comunidades, así como artículos promocionales sujetos a existencias.
  • Apoyo con otros recursos técnicos como:
    * Webcast
    * Boletines
    * Chats
    * Newsgroups
    * Usergroups
    * Eventos Presenciales

Compromisos Comunidad

  • La comunidad debe estar activa por lo menos 12 meses en el programa.
  • Se deberán llevar a cabo reuniones donde se hable de soluciones Microsoft, al menos una  reunión mensual.
  • El grupo coordinador deberá crear y mantener actualizado el sitio de la comunidad.
  • Se deberá contar con al menos un blog por comunidad donde se hable de tecnología

También se comento acerca de que la comunidad será evaluada mes con mes y de la importancia de hacerla crecer y participar.

•
Entre otras cosas interesantes se presentaron los testimonios de otras comunidades y los eventos que han realizado, incluso accediendo a oradores internacionales como Guillermo Som (el Guille).
 
Así que sigan pendientes del portal Aluxes.Net ya que estaremos informando sobre las siguientes actividades de la comunidad y la fecha de nuestra próxima reunión, pero sobre todo participen de manera virtual y compartan sus ideas y comentarios; recuerden que los desarrolladores somos parte esencial del éxito de la industria en la región.
 
Buen fin de semana!
 
Saludos!