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
intybool, 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\een 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 localsy contextosunsafeen 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 structimplementando interfaces: Habilita que las estructurasrefimplementen interfaces. - Tipos
ref structcomo argumentos para parámetros de tipo genérico: Permite el uso de tiposref structcomo 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.