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:
- Constructores principales: puede crear constructores principales en cualquier tipo de
class
ostruct
. - Expresiones de colección: una nueva sintaxis para especificar expresiones de colección, incluido el elemento de propagación, (
..e
), para expandir cualquier colección. - Matrices insertadas: las matrices insertadas permiten crear una matriz de tamaño fijo en un tipo de
struct
. - Parámetros opcionales en expresiones lambda: puede definir valores predeterminados para parámetros en expresiones lambda.
ref readonly
parámetros -ref readonly
permite mayor claridad para las API que podrían usar parámetrosref
o parámetrosin
.- Alias de cualquier tipo: puede usar la directiva de alias
using
para alias de cualquier tipo, no solo de tipos con nombre. - Atributo experimental: indique una característica experimental.
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:
- Literales de cadena sin formato
- Compatibilidad con matemáticas genéricas
- Atributos genéricos
- Literales de cadena UTF-8
- Nuevas líneas en expresiones de interpolación de cadenas
- Patrones de lista
- Tipos locales de archivo
- Miembros requeridos
- Structs predeterminados automáticos
- Coincidencia de patrones de
Span<char>
en unastring
de constante - Ámbito
nameof
ampliado - IntPtr numérico
- Campos
ref
yscoped ref
- Conversión mejorada de grupo de métodos a delegado
- Ola de advertencias 7
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:
- Structs de registro
- Mejoras de tipos de estructura
- Controladores de cadena interpolada
- Directivas
global using
- Declaración de espacios de nombres con ámbito de archivo
- Patrones de propiedades extendidos
- Mejoras en expresiones lambda
- Se permiten cadenas interpoladas
const
- Los tipos de registro pueden sellar
ToString()
- Asignación definitiva mejorada
- Se permite la asignación y la declaración en la misma desconstrucción
- Se permite el atributo
AsyncMethodBuilder
en los métodos - Atributo CallerArgumentExpression
- Pragma
#line
mejorado
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:
- Los atributos genéricos se explican más adelante en este artículo.
- Miembros abstractos estáticos en interfaces.
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:
- Registros
- Establecedores de solo inicialización
- Instrucciones de nivel superior
- Mejoras de coincidencia de patrones: patrones relacionales y patrones lógicos
- Rendimiento e interoperabilidad
- Características de ajuste y finalización
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
ynuint
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
new
con tipo de destino - Funciones anónimas
static
- Expresiones condicionales con tipo de destino
- Compatibilidad con extensiones
GetEnumerator()
para buclesforeach
- 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#:
- Miembros de solo lectura
- Métodos de interfaz predeterminados
- Mejoras de coincidencia de patrones:
- Expresiones switch
- Patrones de propiedades
- Patrones de tupla
- Patrones posicionales
- Declaraciones using
- Funciones locales estáticas
- Estructuras ref descartables
- Tipos de referencia que aceptan valores null
- Secuencias asincrónicas
- Índices y rangos
- Asignación de uso combinado de NULL
- Tipos construidos no administrados
- Stackalloc en expresiones anidadas
- Mejora de las cadenas textuales interpoladas
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ámetroin
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.
- El modificador de acceso
- Expresiones condicionales
ref
:- El resultado de una expresión condicional (
?:
) ahora puede ser una referencia.
- El resultado de una expresión condicional (
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:
async
Main
method- El punto de entrada de una aplicación puede tener el modificador
async
.
- El punto de entrada de una aplicación puede tener el modificador
- 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:
- Variables out
- Tuplas y deconstrucción
- Coincidencia de patrones
- Funciones locales
- Miembros con forma de expresión expandidos
- Variables locales de tipo ref
- Devoluciones de referencias
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:
- Importaciones estáticas
- Filtros de excepciones
- Inicializadores de propiedades automáticas
- Miembros de cuerpo de expresión
- Propagador de null
- Interpolación de cadenas
- operador nameof
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:
- Miembros asincrónicos
- Atributos de información del llamador
- Proyecto de código: Atributos de información del autor de llamada en C# 5.0
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:
- Enlace dinámico
- Argumentos opcionales/con nombre
- Covariante y contravariante de genéricos
- Tipos de interoperabilidad insertados
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:
- Propiedades implementadas automáticamente
- Tipos anónimos (Guía de programación de C#).
- Expresiones de consulta
- Expresiones lambda
- Árboles de expresión
- Métodos de extensión
- Variables locales con asignación implícita de tipos
- Métodos parciales
- Inicializadores de objeto y colecció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:
- Genéricos
- Tipos parciales
- Métodos anónimos
- Tipos de valores que aceptan valores NULL
- Iteradores
- Covarianza y contravarianza
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:
- Clases
- Structs
- Interfaces
- Eventos
- Propiedades
- Delegados
- Operadores y expresiones
- Instrucciones
- Atributos
Artículo publicado originalmente en el blog de NDepend, por cortesía de Erik Dietrich y Patrick Smacchia.