El lenguaje de programación C# versión 3.0 se lanzó el 19 de noviembre de 2007 como parte de .NET Framework 3.5 . Incluye nuevas características inspiradas en lenguajes de programación funcional como Haskell y ML , y se basa principalmente en la introducción del patrón Language Integrated Query (LINQ) en Common Language Runtime . [ 1 ] Actualmente no está estandarizado por ninguna organización de estándares .
Características de C# 3.0
LINQ (consulta integrada en el lenguaje)
LINQ es un nuevo lenguaje de consulta extensible y de propósito general, específico de Microsoft , para muchos tipos de fuentes de datos, incluidas colecciones de objetos simples, documentos XML, bases de datos, etc., que está estrechamente integrado con otras funcionalidades del lenguaje C#. La sintaxis es diferente de SQL , pero toma prestadas características de ella . Un ejemplo:
int [] array = { 1 , 5 , 2 , 10 , 7 };// Seleccionar los cuadrados de todos los números impares en el array ordenados en orden descendente IEnumerable < int > query = from x in array where x % 2 == 1 orderby x descending select x * x ; // Resultado: 49, 25, 1Para implementar LINQ, se añadieron numerosos métodos nuevos a muchas colecciones mediante la System.Linq.Enumerableclase. Las expresiones LINQ se traducen para utilizar estas funciones antes de la compilación. Como alternativa, a veces más potente o directa, se puede acceder directamente a estas funciones. [ 2 ] De esta forma se aprovechan mejor las funciones lambda, que se describen a continuación. El siguiente ejemplo es funcionalmente idéntico al anterior.
IEnumerable < int > consulta = array . Where ( x => x % 2 == 1 ) . OrderByDescending ( x => x ) . Select ( x => x * x ); // Resultado: 49, 25, 1 usando 'array' como se definió en el ejemplo anteriorInicializadores de objetos
Cliente c = nuevo Cliente (); c . Nombre = "John" ;se puede escribir
Cliente c = nuevo Cliente { Nombre = "John" };Inicializadores de colección
MyList lista = nueva MyList (); lista . Agregar ( 1 ); lista . Agregar ( 2 );se puede escribir como
Lista MiLista = nueva MiLista { 1 , 2 };suponiendo que MyListimplementa System.Collections.IEnumerabley tiene un Addmétodo público. [ 3 ]
Inferencia de tipo de variable local
Inferencia del tipo de variable local :
var x = new Dictionary < string , List < float >> ();es intercambiable con
Diccionario < cadena , Lista < flotante >> x = nuevo Diccionario < cadena , Lista < flotante >> ();Esta característica no es solo una forma práctica de simplificar la sintaxis para declaraciones de variables locales más cortas , sino que también es necesaria para la declaración de variables de tipos anónimos. Sin embargo, la palabra clave contextual "var" solo puede aparecer dentro de la declaración de una variable local.
Tipos anónimos
Los tipos anónimos ofrecen una forma práctica de encapsular un conjunto de propiedades de solo lectura en un único objeto sin necesidad de definir explícitamente un tipo. El nombre del tipo lo genera el compilador y no está disponible en el código fuente. El tipo de las propiedades lo infiere el compilador.
var x = new { FirstName = "John" , LastName = "Doe" };Los tipos anónimos son tipos de referencia que derivan directamente de `object`. El compilador les asigna un nombre, aunque la aplicación no puede acceder a ellos. Desde la perspectiva del Common Language Runtime, un tipo anónimo no se diferencia de cualquier otro tipo de referencia, salvo que no se puede convertir a ningún otro tipo que no sea `object`.
Si dos o más tipos anónimos tienen el mismo número y tipo de propiedades en el mismo orden, el compilador los trata como el mismo tipo y comparten la misma información de tipo generada por el compilador. [ 4 ]
Expresiones Lambda
Las expresiones lambda proporcionan una forma concisa de escribir valores de funciones anónimas de primera clase . Compare el siguiente fragmento de C# 2.0:
listaDeFoo . Donde ( delegado ( Foo x ) { return x . Tamaño > 10 ; });con este equivalente en C# 3.0:
listaDeFoo . Donde ( x => x . Tamaño > 10 );En los ejemplos anteriores, las expresiones lambda son simplemente una sintaxis abreviada para delegados anónimos con inferencia de tipos para parámetros y tipo de retorno. Sin embargo, según el contexto en el que se utilicen, un compilador de C# también puede transformar las expresiones lambda en AST que luego se pueden procesar en tiempo de ejecución. En el ejemplo anterior, si listOfFoono se trata de una colección simple en memoria, sino de un contenedor alrededor de una tabla de base de datos, podría usar esta técnica para traducir el cuerpo de la expresión lambda a la expresión SQL equivalente para una ejecución optimizada. En cualquier caso, la expresión lambda en sí se ve exactamente igual en el código, por lo que la forma en que se usa en tiempo de ejecución es transparente para el cliente.
Árboles de expresión
Las expresiones, como x <= y, a = b + c, o incluso las funciones lambda y otras formas complejas, se pueden crear dinámicamente utilizando árboles de expresiones . Gran parte de la funcionalidad la proporcionan los métodos estáticos de la clase System.Linq.Expressions.Expression. También hay varias clases nuevas en ese espacio de nombres que representan las expresiones y expresiones parciales creadas por esos métodos como objetos de software. Estas incluyen BinaryExpression, que podría representar x <= y; LambdaExpressiony muchas otras. Cuando se combina con aspectos de la API de reflexión , esto puede ser una herramienta muy potente, aunque un poco difícil de escribir y depurar. [ 5 ] [ 6 ]
Propiedades automáticas
El compilador genera una variable de instancia privada y los métodos de acceso y modificación apropiados a partir de un código como este:
public string Nombre { obtener ; privado establecer ; }Métodos de extensión
Los desarrolladores pueden usar métodos de extensión para agregar nuevos métodos al contrato público de un tipo CLR existente, sin tener que crear una subclase ni recompilar el tipo original. En realidad, los métodos de extensión son una forma de azúcar sintáctico que proporciona la ilusión de agregar nuevos métodos a la clase existente fuera de su definición. La ilusión se logra con la definición de un método estático que se puede llamar como si fuera un método de instancia, donde el receptor de la llamada (es decir, la instancia) está vinculado al primer parámetro del método, decorado con la palabra clave this.
Los requisitos para un método de extensión son los siguientes:
- Un método de extensión debe definirse en una clase estática.
- Un método de extensión debe definirse como un método estático.
- El primer parámetro de un método de extensión debe tener el siguiente formato, donde tipo es el nombre del tipo que se va a extender:
this typeparameterName - Un método de extensión puede definir opcionalmente otros parámetros que sigan al
thisparámetro.
Esta clase de ejemplo demuestra la definición y el uso de un Leftmétodo de extensión para cadenas de caracteres:
public static class StringExtensions { public static string Left ( this string s , int n ) { return s . Substring ( 0 , n ); } } string s = "foo bar" ; s . Left ( 3 ); // igual que StringExtensions.Left(s, 3), que devuelve "foo";Métodos parciales
Los métodos parciales permiten a los generadores de código generar declaraciones de métodos como puntos de extensión que solo se incluyen en la compilación si alguien realmente los implementa en otra parte de una clase parcial. [ 7 ]
Referencias
- ↑ Anderson, Tim (14 de noviembre de 2006). "C# supera a Java: el arquitecto principal pinta un panorama optimista de C#" . Reg Developer . The Register . Consultado el 20 de enero de 2007 .
- ↑ Walther, Stephen (2008). ASP.NET 3.5 Unleashed . Indiana, EE. UU.: SAMS. págs. 916–917 . ISBN 978-0-672-33011-7
Me doy cuenta de que utilizo más la sintaxis de métodos que la sintaxis de consultas porque la sintaxis de consultas es un subconjunto de la sintaxis de métodos
. - ↑ Torgersen, Mads (10 de octubre de 2006). "¿Qué es una colección?" . Las reflexiones tranquilas del Dr. T. Recuperado el 18 de junio de 2009 .
- ↑ "Tipos anónimos" . Guía de programación de C# . Microsoft . Julio de 2008. Consultado el 18 de junio de 2009 .
- ↑ Walther, Stephen (2008). ASP.NET 3.5 Unleashed . Indiana, EE. UU.: SAMS . págs. 950–952 . ISBN 978-0-672-33011-7.
- ↑ "Árboles de expresiones" . Guía del desarrollador de .NET Framework . Microsoft . Consultado el 26 de abril de 2009 .
- ↑ "Clases y métodos parciales" . Guía de programación de C# . Microsoft . Consultado el 28 de abril de 2009 .
Enlaces externos
- Descripción general de C# 3.0 (Microsoft MSDN)
- C# (lenguaje de programación)