Vamos a ver las diferentes versiones de C# y .NET, y las principales características y funcionalidades que se incorporan en cada uno de ellos.
Recordamos que en .NET existe una clara diferencia entre el Framework, y el lenguaje C#. Sin embargo, pese a estar separados, tanto C# como .NET han evolucionado de la mano.
En cada evolución se han incorporado características y mejoras a ambos. Pero claro, solo están disponibles desde una versión en adelante.
Es decir, por ejemplo, solo puedes usar características de C# 8 en .NET Core 1.0 o superiores
Por supuesto, como no podían hacerlo fácil, las versiones de C# y .NET no van sincronizadas (no podían hacer C# 7.0 va con .NET 7.0… ¡No!).
Así que aquí tenéis un listado con las versiones de ambas, y su fecha de lanzamiento.
C#
.NET version
1.0
.NET Framework 1.0
1.2
.NET Framework 1.1
2.0
.NET Framework 2.0
3.0
.NET Framework 3.5
4.0
.NET Framework 4.0
5.0
.NET Framework 4.5
6.0
.NET Framework 4.6
7.0
.NET Core 1.0
7.1
.NET Core 1.1
7.2
.NET Core 2.0
7.3
.NET Core 2.1
8.0
.NET Core 3.0
9.0
.NET 5.0
10.0
.NET 6.0 (LTS)
11.0
.NET 7.0
12.0
.NET 8.0 (LTS)
13.0
.NET 9.0
14.0
.NET 10.0 (LTS)
LTS = Long Time Service
Y aquí un resumen de las características principales que incorpora el lenguaje C#.
Características por versión
C# 1.0 - Julio 2000
- Tipos de datos básicos y clases: Como un lenguaje orientado a objetos, C# introdujo clases, estructuras, arrays y enumeraciones.
- Namespace y manejo de excepciones: Soporte para nombres de espacio (
namespace
) y manejo de excepciones. - Métodos de delegados: Los delegados permitieron la implementación de patrones de diseño de callback, claves para la programación de eventos.
C# 2.0 - Noviembre 2005
- Generics: Una de las mayores adiciones, los genéricos permitieron crear clases y métodos que trabajaran con cualquier tipo de dato de una manera segura en tiempo de compilación.
- Tipos nullable: Permite que los tipos de valor, como
int
ybool
, puedan asignarnull
. - Iteradores y
yield
: Facilitaron la creación de métodos de iteración personalizados. - Tipos anónimos y co/contravarianza: Características que mejoraron la flexibilidad y el control de las colecciones y delegados.
C# 3.0 - Noviembre 2007
- LINQ (Language-Integrated Query): Una de las adiciones más revolucionarias, LINQ facilitó la consulta de colecciones y bases de datos directamente en el lenguaje.
- Métodos de extensión: Permiten agregar métodos a clases existentes sin modificar su código fuente.
- Expresiones lambda: Simplificaron la creación de funciones anónimas.
- Propiedades automáticas: Simplificaron la sintaxis de las propiedades en clases.
C# 4.0 - Abril 2010
- Parámetros opcionales y nombrados: Permiten simplificar la sintaxis en las llamadas a métodos.
- Tipo
dynamic
: Permite la tipificación dinámica, útil para interoperabilidad con lenguajes como Python y bibliotecas COM. - Soporte mejorado para programación paralela: A través de la introducción de bibliotecas como
Task Parallel Library
(TPL).
C# 5.0 - Agosto 2012
- Programación asíncrona (async/await): Permitió simplificar la programación asíncrona, haciendo más manejable el uso de tareas y evitando bloqueos de la interfaz de usuario en aplicaciones de escritorio.
- Mejoras en la depuración de código: La mejora en la generación de información de depuración facilitó el seguimiento de código.
C# 6.0 - Julio 2015
- Interpolación de cadenas: Permite incluir expresiones dentro de cadenas de una manera sencilla.
- Propiedades de solo lectura: Usando la sintaxis de
=>
, es posible definir propiedades de solo lectura. - Expresiones
nameof
: Para evitar errores de cadenas de texto al especificar nombres de propiedades o variables. - Operador de condición null (
?.
): Facilita el manejo de valores nulos, evitando elNullReferenceException
.
C# 7.0 - Marzo 2017
- Tuplas: Simplificaron el retorno de múltiples valores desde una función.
- Deconstrucción: Permite asignar partes de tuplas o estructuras a múltiples variables en una sola línea.
- Pattern Matching: Introdujo una forma de realizar coincidencias basadas en patrones, útil para expresiones
switch
. - Mejoras en ref locals y return: Permite el manejo de referencias locales y retorno por referencia.
- Funciones locales: Definición de funciones dentro de otras funciones, útil para mejorar la encapsulación.
C# 8.0 - Septiembre 2019
- Nullable Reference Types: Ayuda a evitar errores de nulos, una de las principales fuentes de errores en programación.
- Rangos e índices: Simplificaron la selección de subconjuntos de colecciones y arreglos.
- Interfaz con métodos predeterminados: Permite definir implementaciones de métodos predeterminadas en interfaces.
- Streams asíncronos: Para la manipulación de datos en flujo de manera asíncrona.
- Patrones mejorados: Como los patrones de propiedad, patrón de tuplas y patrones de posición.
C# 9.0 - Noviembre 2020
- Records: Proporciona una manera fácil de crear clases inmutables con métodos de comparación integrados.
- Init-Only Setters: Permiten que las propiedades sean configurables solo durante la inicialización.
- Expresiones
with
: Facilitan la creación de copias de objetos inmutables. - Nuevos patrones de coincidencia: Patrones relacionales y patrones lógicos.
- Top-level programs: Permiten escribir programas sin definir explícitamente una clase
Main
.
C# 10.0 - Noviembre 2021
- Espacios de nombres a nivel de archivo: Facilitan la gestión de espacios de nombres en archivos grandes.
- Tipos de estructuras de registro: Proporciona un tipo de registro para estructuras de valor.
- Mejoras en el rendimiento de expresiones lambda: Las lambdas ahora son más rápidas y pueden tener parámetros
static
. - Propiedades con inicialización automática: Mayor facilidad en la inicialización de propiedades.
- Interpolación de cadenas constante: Permite usar interpolación de cadenas en expresiones constantes.
C# 11.0 - Noviembre 2022
- Parámetros genéricos con
static
: Permiten usar tipos estáticos en definiciones genéricas. - Punteros de referencia: Proporcionan mayor control en operaciones de bajo nivel con memoria.
- Nuevas mejoras en interpolación de cadenas: Simplificación del formato de cadenas con interpolación.
- Atributos en el cuerpo de los métodos: Permite agregar atributos a expresiones locales.
- Permisos de acceso en miembros de registros: Mayor control sobre los permisos de acceso en los registros.
C# 12.0 - Noviembre 2023
- Constructores primarios: Permiten inicializar propiedades de clase directamente en la declaración de clase.
- Expresiones de colección: Introducen una sintaxis más concisa para la creación y manipulación de colecciones.
- Arrays en línea: Facilitan la definición de arreglos de tamaño fijo dentro de una estructura de datos sin necesidad de una declaración explícita de la longitud.
- Parámetros opcionales en expresiones lambda: Ahora las lambdas pueden tener parámetros opcionales.
- Parámetros
ref readonly
: Permiten pasar parámetros por referencia de solo lectura. - Alias de cualquier tipo: Habilita la creación de alias para cualquier tipo.
- Atributo experimental: Permite marcar características o métodos como experimentales.
C# 13.0 - Noviembre 2024
- Colecciones en parámetros (
params
): Permite pasar colecciones directamente a parámetrosparams
. - Nuevo tipo y semántica de
lock
: Introduce mejoras en la semántica del bloqueo. - Nueva secuencia de escape
\e
: Añade soporte para la secuencia de escape\e
en cadenas. - Mejoras en el tipo natural de grupo de métodos: Simplifica la inferencia del tipo cuando se usan grupos de métodos.
- Acceso implícito a indexadores en inicializadores de objetos: Permite inicializar indexadores de objetos directamente dentro de inicializadores.
ref locals
y contextosunsafe
en iteradores y métodos asíncronos: Ahora es posible usar variables locales por referencia y contextos inseguros dentro de métodos asíncronos e iteradores.- Tipos
ref struct
implementando interfaces: Habilita que las estructurasref
implementen interfaces. - Tipos
ref struct
como argumentos para parámetros de tipo genérico: Permite el uso de tiposref struct
como argumentos en genéricos. - Propiedades e indexadores parciales: Ahora se pueden definir propiedades e indexadores en tipos parciales.
- Resolución de sobrecargas con prioridad: Proporciona la capacidad de designar una sobrecarga como preferida sobre otras.