Professional Documents
Culture Documents
Ahora se puede deducir el tipo de una variable según el valor que se le asigna, usando la
palabra clave var.
Declarar una variable con var, hará que el tipo de dicha variable sea inferido del tipo
resultante de la expresión a la que dicha variable se inicialice (esto... sigue siendo C#,
eh?). El tipo de la variable una vez inferido no puede ser modificado;
ANTES AHORA
Tipos anónimos:
Los tipos anónimos son una característica que permite a los desarrolladores definir los
tipos en el código, sin tener que declarar una clase explícita. Aunque se pueden usar en
muchos escenarios, son particularmente útiles cuando usamos LINQ.
El nombre actual del CLR para el tipo anónimo será generado por el compilador de C#.
En realidad el CLR no sabe la diferencia entre un tipo anónimo y tipo no anónimo - así
que la semántica de los dos casos son exáctamente iguales.
El uso de tipos anónimos es perfecto para conseguir estructuras de datos con una
cantidad mínima de código, y es particularmente útil cuando consultamos y
transformamos/incrustamos datos con LINQ.
var persona ={
from p in db.Persona;
select p;
}
Inicialización 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:
¿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 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:
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:
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.
Propiedades automáticas
¿No habéis querido chequear si un string es una dirección válida de email? Hoy,
implementaríamos esto llamando a una clase a parte (seguramente con un método
estático) para ver si el string es válido. Por ejemplo, algo así:
Daros cuenta que en el parámetro de entrada del método está la palabra “this”, antes que
el parámetro de tipo string. Esto le dice al compilador que este método de extensión
debe ser añadido a objetos de tipo string. Dentro del cuerpo del método
IsValidEmailAddress() podemos acceder a todas las propiedades/métodos/eventos
públicos de la instancia del string actual, y devolver true/false dependiendo de si es un
email válido o no.
Para añadir este método de extensión específico a las instancias de string de mi código,
sólo usamos un “using” estándar para importar el namespace que contiene la
implementación de los métodos de extensión:
using ScottGuExtensions;
El compilador resolverá correctamente el método IsValidEmailAddress() en cualquier
string. C# y VB dan soporte completo para el intellisense de los métodos de extensión
en el editor de Visual Studio. De manera que cuando pulsamos el “.” en una variable
string, los métodos de extensión que hayamos implementado, se mostrarán en la lista
del intellisense.
La implementación del método “In()” de arriba, nos permite ver si un objeto específico
está incluido en una secuencia IEnumerable que se le pasa como argumento. Debido a
que todas las colecciones de .NET implementan la interfaz IEnumerable, hemos
conseguido un método útil y descriptivo para comprobar si cualquier objeto de .NET
pertenece a cualquier colección o tabla de .NET.
Podemos usar este método de extensión “In()” para comprobar si un string en particular
está en un array de strings, incluso podemos comprobar si un control de ASP .NET está
en un contenedor de controles.
Como podéis empezar a discernir de los ejemplos de arriba, los métodos de extensión
nos abren escenarios muy ricos y posibilidades de extensibilidad. Cuando se aplican a
clases comunes y a interfaces en .NET nos habilitan frameworks de dominio específicos
muy curiosos.
Expresiones Lambda.
Concepto de métodos anónimos, que permiten que los bloques del código sean escritos
“en línea” donde se esperan los valores del delegado.
C#2.0 ( que venía con VS 2005) introdujo el concepto de métodos anónimos, que
permitía escribir bloques de código donde se esperaban delegados.
// Manera anónima, nos ahorramos el button1_Click que llame a Funciona.
this.button1.Click += delegate { this.Funcion(); };
Las Expresiones Lambda aportan una sintaxis más concisa y funcional para escribir
métodos anónimos. Son extremadamente útiles cuando escribimos peticiones LINQ -
permiten una forma muy compacta de escribir funciones que puedan ser pasadas como
argumentos para una evaluación posterior.
La forma más sencilla para conceptualizar las expresiones lambda es pensar en ellas
como formas de escribir métodos breves en una linea.
params =>expression
p=>p.LastName==”Guthrie”
Nota: Si queréis declarar explícitamente el tipo del parametro de una expresión Lambda,
podeis hacerlo declarando el tipo del parámetro ántes del nombre del parámetro de la
siguiente forma:
Resumen:
Cuando se combinan las expresiones Lambda con los métodos de extensión de LINQ,
nos ofrece una forma muy rica de consultar e interactuar con cualquier tipo de datos
conservando el soporte en tiempo de compilación e intellisense.