Nuevas características de la nueva versión de C# Orcas

La semana pasada lanzamos la versión release de la CTP de Marzo de Visual Studio y .NET Framework “Orcas”. Está disponible para libre descarga en dos versiones, una en VPC ( que permite ejecutarlo en una máquina virtual) y otra como un instalador común (nota: si estáis usando Vista debéis aseguraros de descargaros la versión VPC, para máquinas virtuales). Os la podéis descargar aquí.

Hace unas semanas blogueé  sobre las mejoras (Inglés) para los desarrolladores de ASP .NET que aporta esta release de “Orcas”. Si no habéis leído este post, os lo recomiendo encarecidamente, ya que  creo que os gustarán las nuevas características que trae.

Entre todas las cosas nuevas que aporta el nuevo framework y la herramienta, una de las cosas que creo que les gustará a los desarrolladores (de todos los tipos de aplicaciones .NET) de Orcas son algunas de las nuevas posibilidades que se han añadido a C# y VB. Estos cambios en los lenguajes vienen promovidos para mejorar la experiencia de desarrollo de manera sutil y dramática que mejorarán la productividad y reducirán la cantidad de código que tenemos que escribir.

En las próximas semanas voy a probar y bloguear sobre varias de estas nuevas características de los lenguajes y enseñaré cómo pueden ser usadas para obtener resultados prodigiosos.

Nueva característica de C#: Propiedades automáticas.

Si sois desarrolladores de C#, estaréis acostumbrados a escribir clases con propiedades básicas como en el código siguiente:

public class Person {         private string _firstName;
        private string 
_lastName;
        private int 
_age;
        
        public string 
FirstName {
            
get {
                
return _firstName;
            
}
            
set {
                _firstName 
= value;
            
}
        }
        public string LastName {
            
get {
                
return _lastName;
            
}
            
set {
                _lastName 
= value;
            
}
        }        
        
        
public int Age {
            
get {
                
return _age;
            
}
            
set {
                _age 
= value;
            
}
        }
    }
Daros cuenta de que no estamos añadiendo ninguna lógica en las propiedades Get/Set, todo lo contrario, lo que estamos haciendo es asignar los valores a una variable. La cuestión es ¿entonces porqué no usamos variables en lugar de propiedades? Bueno, hay muchos inconvenientes a la hora de exponer variables públicas. Dos de los problemas más graves son: 1- No podemos hacer un databind de forma fácil sobre variables públicas.2- Si exponemos variables públicas en nuestras clases, más tarde no es posible cambiarlas a propiedades (por ejemplo: para añadir algún tipo de validación en los métodos set) sin tener que recompilar los assemblies que dependan de la antigua clase.El nuevo compilador de C# que viene con Orcas, nos proporciona una forma elegante para hacer que el código que escribamos sea más conciso mientras mantiene la flexibilidad de las propiedades usando una nueva característica conocida como “propiedades automáticas”. Las propiedades automáticas nos permiten evitar la declaración manual de variables privadas y escribir el código de los métodos get/set – En lugar de eso, el compilador puede crear automáticamente las variables privadas necesarias y el código por defecto de los métodos get/set por nosotros.Por ejemplo, usando las propiedades automáticas podemos reescribir el código anterior de la siguiente manera:public class Person {
    
        
public string FirstName {
            
get; set;
        
}         public string LastName {
            
get; set;
        
}        
        
        
public int Age {
            
get; set;
        
}
    }
O si queremos ser más precisos aún, podemos eliminar los espacios en blanco y llegar más lejos de la siguiente forma:

public class Person {
        
public string FirstName { get; set; }
        
public string LastName  { get; set; }        
        
public int    Age       { get; set; }
    }
 Cuando el compilador de Orcas de C# se encuentre con los Get/Set’s vacíos, como en el código anterior, generará automáticamente una variable privada en la clase, e implementará las propiedades públicas get y set para ella. El beneficio de esto es que desde un punto de vista de tipo-contrato, la clase será exactamente igual que la primera implementación de la que hablábamos más arriba. Esto significa que –al contrario que las variables públicas – más adelante podemos añadir validación lógica en el método set sin tener que cambiar ningún componente externo que referencie a mi clase.En Bart De Smet hay una descripción genial sobre qué es lo que pasa por debajo cuando usamos las propiedades automáticas con la CTP release de Marzo de Orcas. Podéis leerlo en este post.Nueva característica en C# y VB: Inicializadores de objetos.Los tipos del .NET Framework confían ciegamente en el uso de propiedades. Cuando instanciamos y usamos clases nuevas, es muy común escribir código como este:      Person person = new Person();
   
person.FirstName "Scott";
   
person.LastName "Guthrie";
   
person.Age 32;
¿Habéis querido hacer esto de una forma más clara (o quizás en sólo una línea)?. Con los compiladores de Orcas para C# y VB, podemos usar una característica también genial llamada “inicializadores de objetos” (en ingles: “object initializers”) que nos permite hacer lo que comentamos y reescribir el código anterior de la siguiente forma:  

Person person = new Person { FirstName="Scott", LastName="Guthrie", Age=32 };  

El compilador generará automáticamente el código de inicialización necesario guardando el mismo significado semántico que en la primera versión (más arriba) del código de ejemplo.Pero no sólo nos permite inicializar un objeto con valores simples, esta nueva característica nos permite poner valores más complejos como propiedades anidadas. Por ejemplo, imaginemos que en la clase Person también tenemos una propiedad llamada “Address” del tipo “Address”. Podríamos escribir el siguiente código para crear un objeto del tipo Person y poner sus propiedades de la siguiente forma:

      Person person = new Person {
      FirstName 
"Scott",
      LastName 
"Guthrie"
      
Age 32,
      Address 
= new Address {
         Street 
"One Microsoft Way",
         City 
"Redmond",
         State 
"WA",
         Zip 
98052
      
}
   }
;   En Bart De Smet también hay una descripción sobre qué es lo que pasa por debajo cuando usamos los inicializadores de objetos con la CTP release de Marzo de Orcas. Podéis leerlo en este post. Nueva característica en C# y VB: Inicializadores de colecciones de objetos.

Los inicializadores de objetos están bien, y hacen mucho más claro añadir objetos a colecciones de objetos. Por ejemplo, si queremos añadir tres personas a una lista genérica de tipo Person. Podemos escribirlo de la siguiente forma:

  List<Person> people = new List<Person>();
            
  
people.Add( new Person { FirstName "Scott", LastName "Guthrie", Age 32 } );
  
people.Add( new Person { FirstName "Bill", LastName "Gates", Age 50 } );
  
people.Add( new Person { FirstName "Susanne", LastName "Guthrie", Age 32 } );
 

Usando los inicializadores de objetos sólo ahorramos 12 líneas de código extra en este ejemplo en comparación con lo que hubiésemos necesitado con el compilador de C# 2.0.

Los compiladores de Orcas para C# y VB nos permiten mucho más, y ahora soportan los “inicializadores de colecciones” (en inglés: “collection initializers”) que nos permiten evitar tener varias llamadas al método Add, y ahorrarnos aún más tecleo:

   List<Person> people = new List<Person> {
      
new Person { FirstName "Scott", LastName "Guthrie", Age 32 },
      
new Person { FirstName "Bill", LastName "Gates", Age 50 },
      
new Person { FirstName "Susanne", LastName "Guthrie", Age 32 }
   }
;

Cuando el compilador encuentra un código como este último, generará el código necesario para añadir los diferentes elementos a la colección.

Resumen

Como desarrolladores tenemos una nueva forma para hacer nuestro código más conciso a la hora de definir objetos, inicializarlos y añadirlos a colecciones. En ejecución, la semántica será exactamente la misma que la que tenemos con la sintaxis más larga de hoy. (Así que no tenemos que preocuparnos por cambios en el comportamiento). No necesitamos escribir tanto por lo que nuestro código será más corto.

En breve escribiré varios post examinando más de cerca las nuevas características de Orcas, como métodos de extensión (en inglés: Extension Methods), Lambdas, y tipos anónimos. Después me meteré con Linq, y veremos cómo aprovecha todas estas características para facilitarnos una forma elegante para consultar e interactuar con datos.

Espero que os haya gustado.

Scott.

Traducido por: Juan María Laó Ramos. Microsoft Student Partner