C# 3.0. Nuevas características I

Introducción

Vale, se que esto viene un poco tarde puesto que lleva mucho tiempo en el mercado ya, y no digamos como beta, de hecho Monet, la librería de plugins que creé hace un tiempo, ya utiliza algunas de dichas características.

Visto por encima podemos decir que C# 3.0 proporciona los siguientes "avances" o "facilidades" nuevas:

  • Propiedades automáticas.
  • Inicializadores de objeto y de colecciones (Object & Collections Initializers)
  • Extensiones (Extension Methods)
  • Expresiones Lambda
  • LinQ

En este primer post solo voy a cubrir las dos primeras partes, en un segundo hablaré de las extensiones y ya en el tercero os hablaré de las maravillas de las lambda expressions y el LinQ.

Propiedades automáticas

Desde pequeñitos nos han dicho siempre que las propiedades son buenas, permiten cambiar el código sin afectar a aquellos que lo usan y encapsulan la funcionalidad. Es por ello que las clases prácticamente nunca (y cuando lo hacen debe ser por muy buenas razones) pubican variables normales, todo son propiedades.

Ahora bien, dicho lo anterior, ¿cuántas veces tenemos código como el siguiente?

public class MiClase
{
  private string mVariable1;
  private string mVariable2;

  public string Variable1 { get { return mVariable1; } set { mVariable1 = value;} }
  public string Variable2 { get { return mVariable2; } set { mVariable2 = value;} }
}

Así visto parece una chorrada, pues bien, realmente lo es. En C# 3.0 son conscientes de ello por lo que podemos hacer:

public class MiClase
{
  public string Variable1 {get; set;}
  public string Variable2 {get; set;}
}

y tan ricamente. Si más adelante queremos implementar getter o setter personalizados nos bastará con editar el código y el cliente seguirá sin enterarse. Internamente lo que está pasando es que el compilador se encarga de generar dos variables internas privadas y asociar un getter y un setter por defecto para ellas. Obviamente esto solo sirve para aquellas propiedades que definan ambos (getter y setter) ¡de lo contrario no podríamos nunca asociar un valor a esa variable!

Object & Collections initializers

Si lo anterior era un paso obvio, este no lo es tanto pero resulta extremadamente cómodo. Con esta "feature" podemos inicializar objetos o colecciones en una declaración simple, ahorrandonos el paso de tener que declarar un constructor enorme o de inicializar a mano. Por ejemplo, comparemos código:

Antes:

  Persona p = new Persona();
  p.DNI = "523213423f";
  p.Nombre = "Jorge";
  p.Direccion = "Ruta del puente, 34";
  p.Telefono = 8005005532  

Ahora:

  Persona o = new Persona { DNI = "523213423f", Nombre = "Jorge",
                                               Direccion = "Ruta del puente, 34",
                                               Telefono = 8005005532 };

y lo mismo pasa con las colecciones de objetos

Antes:

  List<Persona> misContactos = new List<Persona>();
  Persona p = new Persona();
  p.DNI = "523213423f";
  p.Nombre = "Jorge";
  p.Direccion = "Ruta del puente, 34";
  p.Telefono = 8005005532
  misContactos.Add(p);
  Persona p = new Persona();
  p.DNI = "432078832j";
  p.Nombre = "Juan";
  p.Direccion = "Ruta del puente, 32";
  p.Telefono = 8005005531
  misContactos.Add(p);

Ahora:

  List<Persona> misContactos = new List<Persona>
  {
    new Persona { DNI = "523213423f", Nombre = "Jorge",
                            Direccion = "Ruta del puente, 34",
                            Telefono = 8005005532 },
    new Persona { DNI = "432078832j", Nombre = "Juan",
                            Direccion = "Ruta del puente, 32",
                            Telefono = 8005005531 }
  };

y si, puede parecer que no es mucho (tampoco es que sea un gran cambio) pero a mi me resulta extremadamente cómodo de usar...

Conclusión

Hemos visto dos nuevas funcionalidades de C# 3.0 que, pese a no ser espectaculares, si que nos hacen la vida un poquito más fácil. En las próximas entregas veremos el resto de mejoras que, creedme, merecen, y mucho, la pena.

0
No votes yet
Your rating: None