Historia de C#

En este artículo se proporciona un historial de cada versión principal del lenguaje C#. El equipo de C# continúa innovando y agregando nuevas características. Se puede encontrar información sobre el estado detallado de las características de lenguaje, incluidas las características consideradas para las próximas versiones, en el repositorio dotnet/roslyn de GitHub.

Importante

El lenguaje C# se basa en tipos y métodos en lo que la especificación de C# define como una biblioteca estándar para algunas de las características. La plataforma .NET ofrece los tipos y métodos en un número de paquetes. Un ejemplo es el procesamiento de excepciones. Cada expresión o instrucción throw se comprueba para asegurarse de que el objeto que se genera deriva de Exception. Del mismo modo, cada catch se comprueba para asegurarse de que el tipo que se captura deriva de Exception. Cada versión puede agregar requisitos nuevos. Para usar las características más recientes del lenguaje en entornos anteriores, es posible que tenga que instalar bibliotecas específicas. Estas dependencias están documentadas en la página de cada versión específica. Puede obtener más información sobre las relaciones entre lenguaje y biblioteca para tener más antecedentes sobre esta dependencia.

C# versión 12

Publicado en noviembre de 2023

En C# 12 se han agregado las siguientes características:

Además, Interceptores: se lanzó como una característica en vista previa.

En general, C# 12 proporciona nuevas características que hacen que sea más productivo escribir código de C#. La sintaxis que ya sabía está disponible en más sitios. Otra sintaxis permite la coherencia de los conceptos relacionados.

C# versión 11

Fecha de publicación noviembre de 2022

Se agregaron las siguientes características en C# 11:

C# 11 presenta matemáticas genéricas y varias características que admiten ese objetivo. Puede escribir algoritmos numéricos una vez para todos los tipos de números. Hay más características para facilitar el trabajo con struct tipos, como los miembros necesarios y las estructuras predeterminadas automáticas. Trabajar con cadenas resulta más fácil con literales de cadena sin formato, nueva línea en interpolaciones de cadenas y literales de cadena UTF-8. Las características como los tipos locales de archivo permiten que los generadores de origen sean más sencillos. Por último, los patrones de lista agregan más compatibilidad con la coincidencia de patrones.

C# versión 10

Fecha de publicación noviembre de 2021

C# 10 agrega las características y las mejoras al lenguaje C# siguientes:

Hay más características disponibles en el modo de vista previa. Para poder usar estas características, debe establecer <LangVersion> en Preview en el proyecto:

C# 10 sigue trabajando en temas de eliminación de ceremonias, separación de datos de los algoritmos y rendimiento mejorado para .NET Runtime.

Muchas de las características le permiten escribir menos código para expresar los mismos conceptos. Los structs de registro sintetizan muchos de los mismos métodos que las clases de registro. Los structs y los tipos anónimos son compatibles con las expresiones. Las directivas de uso global y las declaraciones de espacio de nombres con ámbito de archivo consiguen que exprese las dependencias y la organización del espacio de nombres con mayor claridad. Las mejoras de lambda facilitan la declaración de expresiones lambda en las que se usan. Los nuevos patrones de propiedad y las mejoras de deconstrucción crean un código más conciso.

Los nuevos controladores de cadenas interpoladas y el comportamiento AsyncMethodBuilder pueden mejorar el rendimiento. Estas características de lenguaje se aplicaron en .NET Runtime para lograr mejoras de rendimiento en .NET 6.

C# 10 también supone un cambio más profundo en la cadencia anual de los lanzamientos de .NET. Dado que no todas las características se pueden completar en un período anual, puede probar un par de características en "versión preliminar" de C# 10. Se pueden usar atributos genéricos y miembros abstractos estáticos en interfaces, pero son características en versión preliminar y pueden cambiar antes de su versión final.

C# versión 9

Fecha de publicación noviembre de 2020

C# 9 se publicó con .NET 5. Es la versión de lenguaje predeterminada para cualquier ensamblado que tenga como destino la versión de .NET 5. Contiene las siguientes características nuevas y mejoradas:

C# 9 continúa tres de los temas de versiones anteriores: quitar complejidad, separar datos de algoritmos y proporcionar más patrones en más lugares.

Las instrucciones de nivel superior hacen que el programa principal sea más fácil de leer. La complejidad es innecesaria: un espacio de nombres, una clase Program y static void Main() son innecesarios.

La introducción de records proporciona una sintaxis concisa para los tipos de referencia que siguen la semántica del valor para la igualdad. Usará estos tipos para definir contenedores de datos que normalmente definen un comportamiento mínimo. Los establecedores de solo inicialización proporcionan la funcionalidad para la mutación no destructiva with (expresiones) en los registros. C# 9 también agrega tipos de valor devuelto de covariante para que los registros derivados puedan invalidar los métodos virtuales y devolver un tipo derivado del tipo de valor devuelto del método base.

Las funcionalidades de coincidencia de patrones se expanden de varias maneras. Los tipos numéricos ahora admiten patrones de rango. Los patrones se pueden combinar mediante los patrones and, or y not. Se pueden agregar paréntesis para aclarar patrones más complejos:

C# 9 incluye nuevas mejoras de coincidencia de patrones:

  • Los patrones de tipo coinciden con un objeto que coincide con un tipo determinado.
  • Los patrones con paréntesis aplican o resaltan la prioridad de las combinaciones de patrones
  • En los patrones and conjuntivos es necesario que los dos patrones coincidan.
  • En los patrones or disyuntivos es necesario que alguno de los patrones coincida
  • En los patrones not negados es necesario que un patrón no coincida.
  • Los patrones relacionales requieren que la entrada sea menor que, mayor que, menor o igual que, o mayor o igual que una constante determinada

Estos patrones enriquecen la sintaxis de los patrones. Tenga en cuenta estos ejemplos:

public static bool IsLetter(this char c) =>
    c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

Con paréntesis opcionales para que quede claro que and tiene mayor prioridad que or:

public static bool IsLetterOrSeparator(this char c) =>
    c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';

Uno de los usos más comunes es una nueva sintaxis para una comprobación NULL:

if (e is not null)
{
    // ...
}

Cualquiera de estos patrones se puede usar en cualquier contexto en el que se permitan patrones: expresiones de patrón is, expresiones switch, patrones anidados y el patrón de la etiqueta case de una instrucción switch.

Otro conjunto de características admite la informática de alto rendimiento en C#:

  • Los tipos nint y nuint modelan los tipos enteros de tamaño nativo en la CPU de destino.
  • Los punteros de función proporcionan una funcionalidad similar a la de un delegado, al mismo tiempo que evitan las asignaciones necesarias para crear un objeto delegado.
  • La instrucción localsinit se puede omitir para guardar instrucciones.

Rendimiento e interoperabilidad

Otro conjunto de mejoras admite escenarios en los que los generadores de código agregan funcionalidad:

  • Los inicializadores de módulo son métodos a los que el runtime llama cuando se carga un ensamblado.
  • Los métodos parciales admiten nuevos modificadores de acceso y tipos de valor devuelto distintos de void. En esos casos, se debe proporcionar una implementación.

Características de ajuste y finalización

C# 9 agrega muchas otras pequeñas características que mejoran la productividad del desarrollador, tanto para escribir como para leer código:

  • Expresiones newcon tipo de destino
  • Funciones anónimasstatic
  • Expresiones condicionales con tipo de destino
  • Compatibilidad con extensiones GetEnumerator() para bucles foreach
  • Las expresiones lambda pueden declarar parámetros de descarte
  • Los atributos se pueden aplicar a las funciones locales

La versión C# 9 continúa el trabajo para hacer que C# siga siendo un lenguaje de programación moderno y de uso general. Las características siguen siendo compatibles con cargas de trabajo y tipos de aplicación modernos.

C# versión 8.0

Fecha de publicación septiembre de 2019

C# 8.0 es la primera versión C# principal que tiene como destino específicamente .NET Core. Algunas características se basan en nuevas funcionalidades de Common Language Runtime (CLR), otras en tipos de biblioteca agregados solo a .NET Core. C# 8.0 agrega las siguientes características y mejoras al lenguaje C#:

Los miembros de interfaz predeterminados requieren mejoras en CLR. Estas características se agregaron en CLR para .NET Core 3.0. Los intervalos y los índices, y los flujos asincrónicos requieren nuevos tipos en las bibliotecas de .NET Core 3.0. Los tipos de referencia que aceptan valores NULL, aunque se implementan en el compilador, son mucho más útiles cuando se anotan bibliotecas para proporcionar información semántica relativa al estado NULL de los argumentos y los valores devueltos. Esas anotaciones se agregan a las bibliotecas de .NET Core.

C# versión 7.3

Fecha de publicación mayo de 2018

Hay dos temas principales para la versión C# 7.3. Un tema proporciona características que permiten al código seguro ser tan eficaz como el código no seguro. El segundo tema proporciona mejoras incrementales en las características existentes. También se han agregado nuevas opciones de compilador en esta versión.

Las siguientes características nuevas admiten el tema del mejor rendimiento para código seguro:

  • Puede tener acceso a campos fijos sin anclar.
  • Puede volver a asignar variables locales ref.
  • Puede usar inicializadores en matrices stackalloc.
  • Puede usar instrucciones fixed con cualquier tipo que admita un patrón.
  • Puede usar restricciones más genéricas.

Se hicieron las mejoras siguientes a las características existentes:

  • Puede probar == y != con los tipos de tupla.
  • Puede usar variables de expresión en más ubicaciones.
  • Puede adjuntar atributos al campo de respaldo de propiedades implementadas automáticamente.
  • Se ha mejorado la resolución de métodos cuando los argumentos difieren en in.
  • Ahora, la resolución de sobrecarga tiene menos casos ambiguos.

Las nuevas opciones del compilador son:

  • -publicsign para habilitar la firma de ensamblados de software de código abierto (OSS).
  • -pathmap para proporcionar una asignación para los directorios de origen.

C# versión 7.2

Fecha de publicación noviembre de 2017

C#7.2 agregó varias características de lenguaje pequeñas:

  • Inicializadores en matrices stackalloc.
  • Uso de instrucciones fixed con cualquier tipo que admita un patrón.
  • Acceso campos fijos sin anclar.
  • Reasignación de variables locales ref.
  • Declaración de tipos readonly struct para indicar que una estructura es fija y que debería pasarse como parámetro in a los métodos de su miembro.
  • Incorporación del modificador in en los parámetros para especificar que un argumento se pasa mediante una referencia sin que el método al que se realiza una llamada lo modifique.
  • Uso del modificador ref readonly en las devoluciones de método para indicar que un método devuelve su valor mediante una referencia, pero que no permite operaciones de escritura en el objeto.
  • Declaración de tipos ref struct para indicar que un tipo de estructura tiene acceso directo a la memoria administrada y que siempre debe estar asignada a la pila.
  • Uso de restricciones genéricas adicionales.
  • Argumentos con nombre no finales:
    • Los argumentos con nombre pueden ir seguidos de argumentos posicionales.
  • Caracteres de subrayado iniciales en literales numéricos:
    • Los literales numéricos ahora pueden tener caracteres de subrayado iniciales antes de los dígitos impresos.
  • Modificador de acceso private protected:
    • El modificador de acceso private protected permite el acceso de clases derivadas en el mismo ensamblado.
  • Expresiones condicionales ref:
    • El resultado de una expresión condicional (?:) ahora puede ser una referencia.

C# versión 7.1

Fecha de publicación agosto de 2017

C# empezó a publicar versiones de punto con C# 7.1. Esta versión agregó el elemento de configuración de selección de versión de lenguaje, tres nuevas características de lenguaje y un nuevo comportamiento del compilador.

Las nuevas características de lenguaje de esta versión son las siguientes:

  • asyncMain method
    • El punto de entrada de una aplicación puede tener el modificador async.
  • Expresiones literales default
    • Se pueden usar expresiones literales predeterminadas en expresiones de valor predeterminadas cuando el tipo de destino se pueda inferir.
  • Nombres de elementos de tupla inferidos
    • En muchos casos, los nombres de elementos de tupla se pueden deducir de la inicialización de la tupla.
  • Coincidencia de patrones en parámetros de tipo genérico
    • Puede usar expresiones de coincidencia de patrones en variables cuyo tipo es un parámetro de tipo genérico.

Por último, el compilador tiene dos opciones, -refout y -refonly, que controlan la generación de ensamblados de referencia.

C# versión 7.0

Fecha de publicación marzo de 2017

C# versión 7.0 se comercializó con Visual Studio 2017. Esta versión tiene algunas cosas interesantes y evolutivas en la misma línea que C# 6.0. Estas son algunas de las nuevas características:

Otras características incluidas:

Todas estas características ofrecen capacidades nuevas para los desarrolladores y la posibilidad de escribir un código de manera más clara que nunca. De manera destacada, condensan la declaración de variables que se van a usar con la palabra clave out y permiten varios valores devueltos a través de tuplas. .NET Core ahora tiene como destino cualquier sistema operativo y tiene puesta la mirada en la nube y la portabilidad. Por supuesto, esas nuevas capacidades ocupan las ideas y el tiempo de los diseñadores de lenguaje, además de ofrecer nuevas características.

C# versión 6.0

Fecha de publicación julio de 2015

Versión 6.0, publicada con Visual Studio 2015, lanzó muchas características más pequeñas que hicieron que la programación de C# sea más productiva. Estas son algunas de ellas:

Entre las otras características nuevas se incluyen estas:

  • Inicializadores de índice
  • Await en bloques catch y finally
  • Valores predeterminados para las propiedades solo de captador

Si observa estas características juntas, verá un patrón interesante. En esta versión, C# comenzó a eliminar el lenguaje reutilizable para que el código sea más breve y legible. Así que, para los que adoran el código simple y limpio, esta versión del lenguaje fue una gran aportación.

En esta versión también se hizo otra cosa, aunque no es una característica de lenguaje tradicional: publicaron el compilador Roslyn como un servicio. Ahora, el compilador de C# está escrito en C# y puede usarlo como parte de su trabajo de programación.

C# versión 5.0

Fecha de publicación agosto de 2012

La versión 5.0 de C#, publicada con Visual Studio 2012, era una versión centrada del lenguaje. Casi todo el trabajo de esa versión se centró en otro concepto de lenguaje innovador: el modelo async y await para la programación asincrónica. Estas son las principales características:

El atributo de información del autor de la llamada permite recuperar fácilmente información sobre el contexto donde se está ejecutando sin tener que recurrir a una gran cantidad de código de reflexión reutilizable. Tiene muchos usos en tareas de registro y diagnóstico.

Pero async y await son los auténticos protagonistas de esta versión. Cuando estas características salieron a la luz en 2012, C# cambió de nuevo las reglas del juego al integrar la asincronía en el lenguaje como un participante de primera clase.

C# versión 4.0

Fecha de publicación abril de 2010

La versión 4.0 de C#, publicada con Visual Studio 2010, introdujo algunas características interesantes:

Los tipos de interoperabilidad incrustados facilitaron el problema de implementación de crear ensamblados de interoperabilidad COM para la aplicación. La covarianza y contravarianza de genéricos proporcionan más capacidad para usar genéricos, pero son más bien académicos y probablemente más valorados por autores de bibliotecas y Framework. Los parámetros opcionales y con nombre permiten eliminar muchas sobrecargas de métodos y proporcionan mayor comodidad. Pero ninguna de esas características está modificando el paradigma exactamente.

La característica más importante fue la introducción de la palabra clave dynamic. Con la palabra clave dynamic, en la versión 4.0 de C# se introdujo la capacidad de invalidar el compilador durante la escritura en tiempo de compilación. Al usar la palabra clave dinámica, puede crear constructos similares a los lenguajes tipados dinámicamente, como JavaScript. Puede crear dynamic x = "a string" y luego agregarle seis, dejando que el runtime decida qué debería suceder después.

Los enlaces dinámicos pueden dar lugar a errores, pero también otorgan un gran poder sobre el lenguaje.

C# versión 3.0

Fecha de publicación noviembre de 2007

La versión 3.0 de C# llegó a finales de 2007, junto con Visual Studio 2008, aunque la cartera completa de características de lenguaje no llegaría realmente hasta la versión 3.5 de .NET Framework. Esta versión marcó un cambio importante en el crecimiento de C#. Estableció C# como un lenguaje de programación realmente formidable. Echemos un vistazo a algunas de las principales características de esta versión:

En retrospectiva, muchas de estas características parecen inevitables e indivisibles. Todas ellas encajan estratégicamente. La mejor característica de la versión de C# era la expresión de consulta, también conocida como Language-Integrated Query (LINQ).

Una vista más matizada examina árboles de expresión, expresiones lambda y tipos anónimos como la base sobre la que se construye LINQ. Sin embargo, en cualquier caso, C# 3.0 presentó un concepto revolucionario. C# 3.0 comenzó a sentar las bases para convertir C# en un lenguaje híbrido funcional y orientado a objetos.

En concreto, permitía escribir consultas declarativas en estilo de SQL para realizar operaciones en colecciones, entre otras cosas. En lugar de escribir un bucle de for para calcular el promedio de una lista de enteros, permitía hacerlo fácilmente como list.Average(). La combinación de métodos de extensión y expresiones de consulta hizo que esa lista de enteros fuera mucho más inteligente.

C# versión 2.0

Fecha de publicación noviembre de 2005

Echemos un vistazo a algunas de las principales características de C# 2.0, que se publicó en 2005 junto con Visual Studio 2005:

Otras características de C# 2.0 agregaron capacidades a las características existentes:

  • Accesibilidad independiente de captador o establecedor
  • Conversiones de grupos de métodos (delegados)
  • Clases estáticas
  • Inferencia de delegados

Aunque C# comenzase como un lenguaje genérico orientado a objetos, la versión 2.0 de C# lo cambió enseguida. Con los genéricos, los tipos y métodos pueden operar en un tipo arbitrario a la vez que conservan la seguridad de tipos. Por ejemplo, tener List<T> nos permite tener List<string> o List<int> y realizar operaciones de tipo seguro en esas cadenas o en enteros mientras los recorremos en iteración. Es mejor usar genéricos que crear un tipo ListInt que derive de ArrayList o convertir desde Object en cada operación.

C# 2.0 incorporó los iteradores. Para explicarlo brevemente, los iteradores permiten examinar todos los elementos de List (u otros tipos enumerables) con un bucle de foreach. Tener iteradores como una parte de primera clase del lenguaje mejoró drásticamente la facilidad de lectura del lenguaje y la capacidad de las personas de razonar sobre el código.

Versión 1.2 de C#

Fecha de publicación abril de 2003

Versión 1.2 de C# incluida en Visual Studio .NET 2003. Contenía algunas pequeñas mejoras del lenguaje. Lo más notable es que, a partir de esa versión, el código se generaba en un bucle foreach llamado Dispose en un IEnumerator cuando ese IEnumerator implementaba IDisposable.

C# versión 1.0

Fecha de publicación enero de 2002

Si echa la vista atrás, la versión 1.0 de C#, publicada con Visual Studio .NET 2002, se parecía mucho a Java. Como parte de sus objetivos de diseño declarados para ECMA, buscaba ser un “lenguaje sencillo, moderno, orientado a objetos y de uso general”. En aquella época, parecerse a Java suponía conseguir esos primeros objetivos de diseño.

Pero si volvemos a echarle un vistazo a C# 1.0 ahora, no lo verá tan claro. Carecía de capacidades asincrónicas integradas y de algunas funcionalidades útiles de genéricos que se dan por sentado. De hecho, carecía por completo de genéricos. ¿Y LINQ? Aún no estaba disponible. Esas características tardarían unos años más en agregarse.

C# 1.0 parecía estar privado de características, en comparación con la actualidad. Lo normal era tener que escribir código detallado. Pero aun así, hay que empezar por algo. C# 1.0 era una alternativa viable a Java en la plataforma Windows.

Las principales características de C# 1.0 incluían lo siguiente:

Artículopublicado originalmente en el blog de NDepend, por cortesía de Erik Dietrich y Patrick Smacchia.