Como ya mencioné en el post anterior, luego de solucionar los problemas severos de performance causados por la combinación WPF + Aceleración de VMWare pude empezar a probar el Beta 1 de Visual Studio 2010.
Por alguna razón oscura que no llego a comprender, en MS decidieron que sería una buena opción hacer que Visual Studio utilice WPF en la capa de presentación.
La ventaja de esto es que la posibilidad de tener cientos y cientos de efectos, transiciones, menúes voladores y demas yerbas, mas la posibilidad de hacer sumamente extensible la UI del afamado IDE.
Pero todo esto viene con un precio... la performance. Si Visual Studio 2008 ya era pesado, la nueva versión salta una o dos categorías mas: iniciar el IDE, abrir una solución chica y compilarla se lleva nada mas y nada menos que 238MB de ram (mas 14MB del PresetantionFontCache).
Igualmente, estos valores y la performance presentada son indicadores que deben ser tomados con pinzas, ya que al ser el Beta 1, todavía queda un largo camino para dar lugar a optimizaciónes (las cuales espero, por el bien de mis VMs, que aparezcan!).
Otro problema que encontré (también atribuible al estado de Beta del producto) fue la cantidad de crashes que tuve. Durante el coding del ejemplo que dejé al final (una tarde) me habra crasheado unas 5 veces... bastante mas de lo tolerable. Esperemos que la estabilidad sea un punto importante a mejorar en la proxima Beta o RC
Cerrado este tema, pasemos a los "chiches" nuevos que trae:
.NET 4 (beta) y C# 4
Nueva version del CLR y del lenguaje estrella de la plataforma .NET. En este otro post (http://zpodblog.blogspot.com/2009/01/material-de-la-conferencia-sobre-c-4.html) pueden bajar una presentación que dimos con RodoF sobre los features nuevos incluidos en el lenguaje (tipado dinámico, parametros opcionales y por nombre, co y contra varianza en parametros de tipos, y algunas cosas mas).
F#
Esta versión de Visual Studio es la primera en incluir este lenguaje funcional para la plataforma .NET.
Debo decir que todavía no me puse a ver mucho sobre el mismo, pero será cuestion de encontrar una excusa suficientemente buena como para incluir alguna librería que tenga que hacer en F# para algún proyecto a futuro.
Por ahora los dejo con un bonito ejemplo de como obtener el n-esimo termino de la suceción de fibonacci (no puedo evitar caer en los clásicos) en F#:
let rec fibonacci elem =
match elem with
| 1 -> 1
| 2 -> 1
| n -> fibonacci (n - 1) + fibonacci (n - 2)
Printf.printf "Ingrese numero de termino: "
let termino = System.Console.ReadLine();
Printf.printfn "%i" (fibonacci (System.Int32.Parse termino))
let k = System.Console.ReadKey();
Parallel Extensions
Quienes hayan tenido que hacer optimizaciones en algún proyecto sabrán que uno de los primeros puntos a mirar es la paralelización de tareas independientes. Las Parallel Extensions vienen a simplificar este tipo de tareas.
Por ejemplo, en caso de tener una colección y querer aplicar una funcion a cada uno de los elementos, en vez de hacer un viejo y querido "foreach", podemos hacer:
miColeccion.AsParallel().ForAll(elem =>
{
//codigo a ejecutar por cada elemento de la colección
});
La gran ventaja de esto es que nos abstraemos de todo el manejo de concurrencia, manteniendo la ganancia de performance.
Sequence Diagram
Si hacemos click derecho sobre un método, vamos a notar que hay una nueva opción llamada "Generate Sequence Diagram". Al seleccionarla nos pregunta la profundidad máxima para las llamadas del diagrama y si queremos excluir las llamadas a clases dentro de ciertos namespaces (como System, u otros personalizables). Finalmente, nos presenta un diagrama como este:
Este es un feature sumamente útil en caso de tener que comprender lo que hace un código ajeno, sin tener que empezar a navegar todo el código! (y pensar que yo casi me hago una herramienta para generar estos diagramas... por suerte nunca prosperó!)
Definitivamente, una gran adición al Visual Studio.
Bueno, por ahora esto es lo que pude ver. Me queda pendiente el "Architecture View" y varios features mas que ni siquiera llegué a ver.
Como extra, dejo mi primer proyectito hecho en C# 4 que permite acceder datos provenientes de una conexión de ADO.NET levantando los campos como propiedades dinámicas del resultado y pudiendo aplicar un pipeline de filtros que hagan transformaciones sobre el resultado al ser obtenido.
La idea es poder hacer este tipo de cosas
using (var conn = new DynamicConnection(realADOConnection, new ImageMapper()))
{
dynamic result = conn.Query("SELECT * FROM Customer WHERE IdCustomer = @0", 37);
/* O tambien
dynamic result = conn.Query("SELECT * FROM Customer WHERE IdCustomer = @IdCustomer",
DynamicConnection.CreateParameter("@IdCustomer", 37));
*/
foreach (dynamic row in result) //recorrer el resultado con un foreach
{
//lectura directa
int id = row.IdCustomer;
string name = row.Name;
/*
Aca, el ImageMapper se encarga de leer el campo
y mapearlo a un Image
*/
Image customerPicture = row.Picture;
grid.AddRow(id, name, customerPicture);
}
//Obtengo un solo valor
dynamic val = conn.QueryValue("SELECT TOP 1 Name FROM Customer WHERE Id = @0", 37);
MessageBox.Show(val);
}
Lo pueden bajar de aca: DynamicDataAccess
Hasta la próxima!
Z