Evoluciona: Evolución: C#2.0, C#3.0 y LINQ

Evolución: C#2.0, C#3.0 y LINQ
Desde C++ se produce una evolución que trae nuevas características en C#1.0, C#2.0 y C#3.0, que bien utilizadas, dan facilidad a la programación, y eficiencia al programador.
Algunas de estas características las expongo a continuación, aunque sin entrar en detalle en el código, pretenden aclarar en qué consisten.

C# 2.0

* Nullable Types
Imaginemos un objeto de tipo “cliente”, que contiene los datos de un cliente, entre ellos, la fecha de defunción “fdef”. Si el cliente está aún vivo, ¿Qué valor tiene “fdef”? Nos vemos obligados a usar un valor centinela (01/01/1938), o bien incluir un campo “bool vivoq”. Lo que complica la lógica en el manejo de este objeto.
Solución:
Ahora podemos asignar NULL a los tipos simples:
int? numero = null;
DateTime? fdef = null;

* Partial Classes
Las librerías de IU se encargan de autogenerar código para los botones, cajas, y todos los elementos de la interfaz. Muchas veces modificamos este código y objetos autogenerados, por lo que si se realizan cambios en la interfaz, pueden perderse esos cambios al regenerar el código.
Solución:
Con Partial Classes podemos separar el código autogenerado de nuestro código mediante la división de una clase en dos o más clases parciales:
Código autogenerado:
public partial class Form1 : Form{
...
}
Y en otro fichero, nuestro código:
partial class Form1{
...
}

* Anonymous Methods
Ahora se pueden declarar métodos tipo “inline”. Por ejemplo:
this.button1.Click += delegate { MessageBox.Show("Click"); };
Nos hemos ahorrado:
private void button5_Click(object sender, EventArgs e){
MessageBox.Show(“Click”);
}

* Suporte para 64 bits:
Cualquier aplicación “pura .NET” puede elegir correr como 32 o 64 bits( es el JITTer el que genera el asm específico ). Si la aplicación utiliza una dll de 32 bits… catacrash

C# 3.0

* Automatic properties:
antes:
public string nombre{
get{
return nombre;
}
private set{
nombre = value;
}
}
ahora:
public int edad{
get;
private set;
}

* Collection Initializers
Antes:
Cliente cliente = new Cliente( );
Cliente.Edad = 34;
Cliente.Nombre = “Pepe”;
Cliente.Dirección = new Dirección(“Calle Los Molinos 10”, 28220);
Ahora:
Cliente cliente = new Cliente { Edad = 34, Nombre = “Pepe”,
Direccion = new Direccion{Calle= “…”, CP=28220} ;

* El compilador infiere tipos:
var nombre = “pepe”;
var edad = “42”;
En tiempo de compilación nombre es un string a todos los efectos.
Podemos hacer :
int anios = edad; // conversión posible
Es de mucha utilidad cuando utilizamos tipos muy complejos, y también ahorra código a la hora de realizar conversiones de tipos de forma manual.
Podremos incluso pasar a una misma función parámetros de distintos tipos.

* Extension Methods
Podemos añadir métodos a una clase sin modificarla ni derivar de ella

* Lambda expressions
Sintaxis funcional y concisa para la implementación de funciones anónimas. Muy útiles.
Sintáxis:
(TipoParámetro parámetros de entrada) => expresión
Ejemplo:
Contar el número de nombre que empiezan por p:
int pNames = names.Count( name => name.StartsWith("P") );

* Querry Expressions
Con el lenguaje SQL podemos emitir consultas tipo SELECT contra una base de datos con mucha facilidad, ¿Y si pudiéramos emitirlas contra una estructura en memoria? Hecho:
var pNames = from n in names
where n.StartsWith("P")
orderby n.Length descending
select new { Name = n, Length = n.Length };
Los Query Operators se catalogan como Inmediates o Deferred: Los que provocan la evaluación inmediata o no.

C# 3.0: LINQ

Con LINQ se consigue integrar la capacidad de realizar queries contra “cualquier DataSource” de forma integrada en el lenguaje:
- LinqObjects: Queries contra colecciones tipadas en memoria
- LinqXML: Queries contra XML, especialmente contra el nuevo API System.Xml.Linq
- LinqSQL : Queries contra SqlServer.
- LinqEntities: Queries contra el EntityFramework, completo OR-Mapper con soporte a distintas BBDDs
- LinqDataSets: Queries contra DataSets. Extensión de LinqObjects específica para facilitar el trabajo con DataSets y sus clases relacionadas.
- Extensibilidad: Creación de extensiones para otros DataSources , como por ejemplo los existentes LinqAmazon, LinqLDAP...

In this note

No one.