C# y .NET

¿Qué es C#?

C# fue diseñado exclusivamente para la plataforma .NET Framework de Microsoft y se pronuncia «See Sharp».

Microsoft necesitaba un marco de desarrollo integrado unificado y totalmente orientado a objetos que solucionara los defectos de las tecnologías antiguas, por lo que comenzó a crear un nuevo entorno de ejecución de código junto con una cadena de herramientas de desarrollo.

Tras más de 20 años de evolución, C# pasó de ser un lenguaje exclusivo para Windows a una herramienta multiplataforma compatible con múltiples sistemas operativos.

Hoy en día, C# junto con .NET forman una solución multiplataforma completa: sirven para desarrollar aplicaciones de Windows, macOS, Linux y Android, además de ser el entorno de ejecución preferido en la mayoría de sistemas cloud.

Gracias al fuerte respaldo de Microsoft, C# recibe actualizaciones muy frecuentes. En 2022 salió la versión 7. El lenguaje mantiene la compatibilidad con código escrito hace 20 años, mientras que las versiones nuevas ofrecen una sintaxis más concisa, elegante y estructuras más compactas. En el año 2026 contamos con la versión 15.

Breve historia de versiones de C# (extracto)

  • C# 1.0 (2001): lanzamiento oficial público
  • C# 2.0 (VS2005): genéricos, iteradores, métodos anónimos
  • C# 3.0 (VS2008): métodos de extensión, expresiones Lambda, LINQ (consulta integrada al lenguaje)
  • C# 4.0 (2010): parámetros con nombre/opcionales, tipo dinámico dynamic, biblioteca de tareas paralelas TPL para aprovechar al máximo los procesadores multinúcleo
  • C# 5.0: soporte nativo para tareas asíncronas con async/await
  • C# 6.0: interpolación de cadenas, miembros con cuerpo de expresión, sintaxis simplificada para propiedades
  • C# 7.0~7.3: valores de retorno múltiples mediante tuplas, simplificación de parámetros out, coincidencia de patrones, método Main asíncrono
  • C# 8.0/9.0/10.0: registros (tipos de referencia inmutables), sentencias de nivel superior (sin necesidad de Main), métodos de interfaz predeterminados, funciones locales estáticas, tipos liberables asíncronos, coincidencia de patrones en todo el lenguaje
  • C#11 (.NET7): cadenas sin procesar, matemáticas genéricas, propiedades required
  • C#12 (.NET8): constructores principales, sintaxis abreviada para colecciones, matrices en línea
  • C#13 (.NET9): propiedades parciales, indexadores de extensión, locales ref en iteradores
  • C#14 (.NET10): alias genéricos, coincidencia profunda de colecciones, azúcar sintáctico SIMD

Windows sigue siendo la plataforma principal de C#, pero gracias al .NET Runtime el código se ejecuta directamente en sistemas como Linux, permitiendo escribir una única base de código para desplegarla en múltiples sistemas operativos.

El framework .NET

El .NET Framework se lanzó por primera vez en 2002.

.NET Framework soluciona las limitaciones de las generaciones anteriores de desarrollo, y sus ventajas principales son:

  1. Soporte multiplataforma de dispositivos: funciona en servidores, ordenadores, PDAs, teléfonos móviles y otros hardware;
  2. Cumplimiento de estándares industriales: soporte nativo de protocolos de comunicación universales como XML, HTTP, SOAP, JSON y WSDL;
  3. Sandbox de seguridad: proporciona aislamiento seguro para ejecutar código de fuentes no confiables.

Los tres componentes esenciales de .NET Framework

  1. CLR Common Language Runtime (entorno de ejecución) gestiona todo el ciclo de vida de los programas: administración de memoria y recolección de basura, validación de seguridad del código, planificación de hilos y manejo de excepciones.
  2. Conjunto de herramientas de desarrollo entornos de desarrollo integrados, compiladores .NET multilingües (C#/VB.NET/F#, etc.), depuradores y tecnologías backend web como ASP.NET/WCF.
  3. BCL Biblioteca de Clases Base (también llamada FCL Framework Class Library) contiene una enorme cantidad de clases genéricas predefinidas que el desarrollador puede invocar directamente.

Puntos de mejora de .NET respecto al desarrollo tradicional de Windows

Modelo orientado a objetos unificado

CLR, BCL y C# están profundamente integrados y ofrecen un modelo OOP unificado. Aplicaciones de escritorio, móvil, web y sistemas distribuidos comparten el mismo paradigma de desarrollo, con lógica y sintaxis consistentes en cualquier dispositivo.

Recolección automática de basura GC

El CLR incluye un recolector de basura nativo que libera automáticamente la memoria de objetos que ya no se usan. El desarrollador no necesita liberar memoria manualmente ni detectar fugas de memoria, lo que reduce considerablemente el trabajo de mantenimiento.

Interoperabilidad multidimensional
  1. Intercambio entre lenguajes .NET: las clases escritas en distintos lenguajes .NET pueden llamarse y heredarse mutuamente; la plataforma no está ligada a un único lenguaje de programación;
  2. Invocación de plataforma P/Invoke: permite llamar directamente a interfaces DLL nativas de Win32 escritas en C;
  3. Compatibilidad con COM: los componentes .NET y los componentes COM tradicionales pueden invocarse en ambos sentidos.

Despliegue simplificado: no requiere dependencias del registro; en escenarios mínimos basta con copiar los archivos para ejecutar el programa;

Ensamblados paralelos: se pueden coexistir distintas versiones de una misma DLL en un dispositivo. Cada programa se vincula a la versión de librería con la que se compiló, solucionando conflictos de versiones de DLL.

Validación de seguridad de tipos El CLR (Common Language Runtime) valida obligatoriamente parámetros y tipos de datos. Incluso en interacciones entre componentes de distintos lenguajes garantiza la seguridad de tipos y evita accesos ilegales a memoria.

Amplia biblioteca base BCL

Incluye gran cantidad de clases de utilidad genéricas

  • Herramientas básicas para archivos, cadenas, cifrado y seguridad;
  • Contenedores de colecciones: listas, diccionarios, tablas hash;
  • Herramientas de multihilo, sincronización y concurrencia;
  • Clases para lectura y escritura de documentos XML
  • Y muchas más…

Toda la lógica de bajo nivel común está preimplementada, por lo que el desarrollador solo debe escribir la lógica propia del negocio y reutilizar herramientas maduras para evitar reinventar la rueda.

Diagrama de flujo de un programa .NET: el código que escribes se compila a código intermedio IL, el IL puede invocar librerías proporcionadas por la BCL y finalmente es entregado al CLR para su ejecución.

Relación entre C# y .NET

.NET Framework: una plataforma completa de desarrollo y ejecución formada por dos componentes centrales

  1. CLR (Common Language Runtime): se encarga de la gestión de memoria del código, su ejecución y validaciones de seguridad
  2. BCL (Biblioteca de Clases Base): amplio conjunto de código utilitario genérico (archivos, red, interfaz gráfica, concurrencia, etc.)

C#: un lenguaje de programación diseñado específicamente para la plataforma .NET, usado para escribir código que se ejecuta sobre el CLR

Además de C#, existen otros lenguajes compatibles con .NET, como F# y VB.NET.

El propósito del framework .NET es ser multiplataforma y multilingüe. Multiplataforma significa que funciona en distintos sistemas operativos; multilingüe permite que componentes desarrollados en lenguajes diferentes se accedan mutuamente.

Compilación a Lenguaje Intermedio Común (CIL)

El compilador de cada lenguaje .NET lee los archivos de código fuente y genera archivos de salida denominados ensamblados (assembly)

Hay dos tipos de ensamblados: archivos ejecutables (exe) o librerías de enlace dinámico (DLL)

El código interno de un ensamblado no es código máquina nativo del procesador, sino un código intermedio llamado Lenguaje Intermedio Común (Common Intermediate Language, CIL).

Un ensamblado contiene principalmente estos elementos:

  1. Instrucciones en código CIL del programa
  2. Metadatos de todos los tipos definidos en el programa
  3. Metadatos con las referencias a otros ensamblados externos

La abreviatura del lenguaje intermedio ha cambiado a lo largo del desarrollo de .NET, por lo que distintas fuentes usan nombres diferentes. Tanto Lenguaje Intermedio (IL) como Lenguaje Intermedio de Microsoft (MSIL) hacen referencia al CIL.

Compilación a código nativo y ejecución

El CIL no se convierte previamente a código máquina nativo; solo cuando el programa se ejecuta el CLR realiza estos tres pasos:

  1. Validar la información de seguridad del ensamblado
  2. Asignar memoria de ejecución
  3. Enviar al compilador JIT para compilar por fragmentos a código nativo
Mecanismo de compilación bajo demanda JIT

Solo se compila el código que se va a ejecutar, y tras compilarlo se almacena en caché para reutilizarlo. El código que no se invoca nunca se compila, y el mismo fragmento solo se compila una única vez.

Ensamblado (CIL + información de tipos) → CLR (compilador JIT) → Código nativo → Servicios del sistema operativo

Responsabilidades de gestión del CLR

Una vez convertido el CIL a código nativo, el CLR gestiona automáticamente: recolección de memoria no utilizada, comprobación de límites de arrays, validación de tipos de parámetros y manejo de excepciones.

Código administrado y no administrado
  • Código administrado: código escrito en lenguajes .NET, cuya ejecución y control dependen del CLR
  • Código no administrado: no está bajo el control del CLR, ejemplos son las DLL nativas de Win32 escritas en C/C++

Hoy en día Microsoft cuenta con compilación AOT: se puede compilar directamente el código C# a código nativo, de forma similar a C++, y ejecutar el archivo EXE sin necesidad de instalar el entorno de ejecución .NET.

Herramienta NGen

Realiza una precompilación sin conexión de los ensamblados a imágenes nativas, lo que permite saltarse el proceso JIT durante la ejecución y acelerar el arranque de la aplicación.

.NET Core AOT es la nueva generación de precompilación, capaz de generar ejecutables nativos independientes sin dependencias del runtime.

Ensambaldo (Información de tipos, CIL)
        ↓
Compilador JIT
        ↓
Código nativo
        ↓
Servicios del Sistema Operativo

Independientemente del lenguaje original del código fuente, todos siguen el mismo flujo de compilación y ejecución.

Cada lenguaje tiene su propio compilador: VB.NET tiene su compilador específico, C# el suyo. Todos transforman su código a CIL, el CIL pasa por el JIT para generar código nativo y este es ejecutado por el procesador. Esta es la razón por la que los programas desarrollados con .NET requieren instalar el entorno .NET, igual que Java necesita el JRE.

flowchart TD
    subgraph Compile_Time
        A[C# Source] --> B[C# Compiler]
        B --> C[Assembly CIL]
        D[VB Source] --> E[VB Compiler]
        E --> C
        F[Xyz.NET Source] --> G[Xyz.NET Compiler]
        G --> C
    end

    subgraph Run_Time
        C --> H[JIT Compiler]
        H --> I[Native Code]
        I --> J[Operating System Services]
    end

El diagrama superior muestra el flujo de compilación y ejecución para todos los lenguajes.

Common Language Runtime (CLR)

El componente central de .NET Framework es el CLR, que se sitúa por encima del sistema operativo y se encarga de gestionar la ejecución de los programas.

  • Recolección automática de basura (GC)
  • Validación de seguridad y autenticación mediante la Biblioteca de Clases Base (BCL)
  • Ofrece amplias capacidades de programación, incluidos servicios web, servicios de datos y más funcionalidades
flowchart TD
    subgraph Unmanaged_Code
        A[Non-.NET Program] --> OS[Operating System]
    end

    subgraph Managed_Code
        B[Assembly] --> CLR[Common Language Runtime]
        C[Assembly] --> CLR
        D[Assembly] --> CLR

        subgraph CLR[Common Language Runtime]
            M[Memory Management] --- E[Exception Handling]
            G[Garbage Collection] --- R[Reflection Services]
            J[JIT Compiler] --- L[Class Loader]
            S[Security Services]
        end

        CLR --> OS
    end

Infraestructura Común de Lenguaje (CLI)

Cada lenguaje de programación integra un conjunto de tipos nativos básicos para representar números enteros, números de coma flotante, caracteres y otros datos.

Infraestructura Común de Lenguaje (CLI) es un conjunto de estándares que unifica todos los componentes de .NET Framework en un sistema completo y compatible.

Por ejemplo, el número de bits que ocupa un entero es idéntico en todos los lenguajes compatibles.

flowchart TD
    subgraph CLI[CLI]
        CLR[Common Language Runtime] --- CLS[Common Language Specification]
        BCL[Base Class Library] --- MDS[Metadata Definition & Semantics]
        CTS[Common Type System] --- CIL[Common Intermediate Language]
    end

La mayoría de desarrolladores no necesitan profundizar en toda la especificación CLI, pero es imprescindible dominar el Sistema Común de Tipos CTS y la Especificación Común de Lenguaje CLS.

CTS Sistema Común de Tipos

  • Incluye un conjunto estandarizado de tipos de datos básicos con propiedades fijas para cada uno;
  • Todos los tipos propios de cada lenguaje .NET se mapean a un subconjunto de estos tipos estándar;
  • Todos los tipos heredan de la clase raíz object;
  • El estándar unificado permite que los tipos nativos del sistema y los definidos por el usuario se intercambien entre cualquier lenguaje .NET.

CLS Especificación Común de Lenguaje

Define las reglas unificadas que deben cumplir todos los lenguajes compatibles con .NET, cubriendo restricciones de interacción entre lenguajes como tipos de datos, constructores de clases y paso de parámetros.

Diferencias entre .NET y .NET Framework

.NET es la plataforma multiplataforma moderna de Microsoft, mientras que .NET Framework es el runtime y librerías antiguas limitadas solo a Windows. Todas las funcionalidades nuevas se desarrollan exclusivamente en .NET; .NET Framework se encuentra en fase de mantenimiento y solo recibe actualizaciones de seguridad.

.NET es multiplataforma y constituye el foco principal de desarrollo de Microsoft. El resto del contenido de esta guía se centrará en él.

Característica.NET.NET Framework
Soporte de plataformasMultiplataforma (Windows, Linux, macOS, contenedores, móvil mediante MAUI)Solo Windows
EstadoActualizaciones constantes (.NET 5 hasta .NET 10, lanzamientos anuales con soporte LTS)Modo mantenimiento (4.8 es la versión final, solo parches de seguridad)
RendimientoArranque más rápido, mayor rendimiento, recolección de basura optimizadaRendimiento más antiguo, depende de las API de Windows
Casos de usoProyectos nuevos: API web, microservicios, cloud nativo, escritorio/móvil multiplataformaProyectos antiguos: Web Forms, WCF, Windows Workflow, etc.
DespliegueCompatible con Docker, contenedores y entornos cloudNo soporta contenedores, depende de Windows Server
Lenguajes compatiblesC#, F#, VB.NET (multiplataforma)C#, VB.NET (solo Windows)

Las diferencias entre .NET y .NET Framework no son muy grandes. Ambos usan lenguajes como C#, F# y VB.NET y mantienen una sintaxis central común. La mayor parte del código C# que escribas podrá compilarse y ejecutarse tanto en .NET Framework como en .NET (Core/5/6/7/8…).

Las diferencias radican principalmente en la disponibilidad de librerías de clases, no en la sintaxis.

Tecnologías como WCF, Web Forms y Windows Workflow, presentes en .NET Framework, han sido eliminadas o sustituidas en el .NET moderno.

En .NET se han añadido API modernas como Span<T>, ValueTask y Records, que no están disponibles en el antiguo .NET Framework.

Dado que .NET Framework funciona únicamente en Windows y .NET es multiplataforma, se han eliminado algunas librerías exclusivas de Windows en .NET. Por ejemplo, System.Drawing funciona en Windows, pero en el .NET multiplataforma se marca como compatible solo con este sistema operativo. Si necesitas una librería de gráficos en .NET no puedes usar System.Drawing y deberás recurrir a librerías de terceros como SkiaSharp de Google.

Ten en cuenta que las diferencias mencionadas pertenecen al nivel del framework; a nivel de lenguaje, como C#, prácticamente no hay distinciones. La sintaxis C# es idéntica en ambos entornos. La verdadera diferencia radica en las librerías de clases y el entorno de ejecución, es decir, el conjunto de APIs disponibles.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *