B3-T6: Plataforma .NET
.NET es la segunda plataforma de desarrollo más preguntada tras Java. Las preguntas suelen centrarse en la arquitectura (CLR, CIL, BCL), comparaciones con Java (struct vs class, NuGet vs Maven) y el stack web ASP.NET.
EVOLUCIÓN DE .NET
Fuente: Microsoft Learn (learn.microsoft.com) — documentación oficial pública. Historia basada en anuncios públicos y releases de .NET.
| Año | Versión | Hito clave |
|---|---|---|
| 2002 | .NET Framework 1.0 | Lanzamiento inicial: CLR, BCL, C# 1.0, ASP.NET, Windows Forms |
| 2005 | .NET Framework 2.0 | Generics en C# 2.0, nullable types |
| 2007 | .NET Framework 3.5 | LINQ, lambdas (C# 3.0), Entity Framework 1.0 |
| 2010 | .NET Framework 4.0 | Dynamic typing (dynamic), Task Parallel Library (TPL), MEF |
| 2012 | .NET Framework 4.5 | async/await (C# 5.0), mejoras WCF y WPF |
| 2016 | .NET Core 1.0 | Multiplataforma (Windows, Linux, macOS). Open source (MIT) |
| 2019 | .NET Core 3.0/3.1 | WPF/WinForms en Core, C# 8.0 (nullable reference types) |
| 2020 | .NET 5 | Unificación: se elimina "Core" del nombre. Un solo .NET para todo |
| 2021 | .NET 6 (LTS) | Minimal APIs, Hot Reload, MAUI (preview) |
| 2022 | .NET 7 | Native AOT, mejoras de rendimiento |
| 2023 | .NET 8 (LTS) | Blazor unificado (SSR + WASM), Native AOT para ASP.NET, Aspire |
| 2024 | .NET 9 | Mejoras AOT, AI integrations, Aspire mejorado |
Tip examen: Desde .NET 5 (2020), no hay .NET Framework nuevo. El último .NET Framework es 4.8.x (solo Windows, solo mantenimiento). Todo el desarrollo nuevo va en .NET (Core), que es multiplataforma y open source.
ARQUITECTURA .NET
| Componente | Qué es | Equivalente Java |
|---|---|---|
| CLR (Common Language Runtime) | Máquina virtual que ejecuta código CIL (bytecode .NET) | JVM |
| CIL (Common Intermediate Language) | Código intermedio al que se compilan todos los lenguajes .NET | Bytecode Java |
| BCL (Base Class Library) | Biblioteca estándar: colecciones, I/O, redes, XML, etc. | Java SE API (java.lang, java.util) |
| CTS (Common Type System) | Sistema de tipos compartido por todos los lenguajes .NET | JLS type system |
| CLS (Common Language Specification) | Subconjunto del CTS que garantiza interoperabilidad entre lenguajes | — |
| JIT Compiler | Compila CIL → código máquina nativo en tiempo de ejecución | JIT de la JVM (HotSpot) |
| GC (Garbage Collector) | Recolector de basura generacional (Gen 0, 1, 2 + LOH) | G1 GC / ZGC |
Pregunta clásica: El CLR ejecuta CIL (antes llamado MSIL), no código C# directamente. El proceso es: Código fuente → Compilador → CIL (assembly .dll/.exe) → JIT → Código máquina nativo.
COMPILACIÓN Y EJECUCIÓN
| Modo | Proceso | Cuándo |
|---|---|---|
| JIT (Just-In-Time) | CIL → nativo en runtime, método por método | Comportamiento por defecto |
| AOT (Ahead-Of-Time) | CIL → nativo en compilación. No necesita CLR en destino | .NET Native, Native AOT (.NET 7+), Xamarin/MAUI |
| Tiered Compilation | Primera ejecución rápida (tier 0), optimización progresiva (tier 1) | Default desde .NET Core 3.0 |
LENGUAJES .NET
| Lenguaje | Paradigma | Uso principal | Característica diferenciadora |
|---|---|---|---|
| C# | OOP, funcional | Lenguaje principal de .NET: web, desktop, cloud, juegos (Unity) | Evoluciona rápido: records, pattern matching, top-level statements |
| VB.NET | OOP | Legacy, migración desde VB6 | Sintaxis verbosa, sin nuevas features desde .NET 5 |
| F# | Funcional puro + OOP | Data science, finanzas, scripts | Inmutabilidad por defecto, discriminated unions, type inference |
C# vs JAVA — COMPARATIVA
Pregunta frecuente del examen TAI: comparar mecanismos equivalentes entre las dos plataformas.
| Concepto | C# / .NET | Java |
|---|---|---|
| Máquina virtual | CLR | JVM |
| Código intermedio | CIL (MSIL) | Bytecode |
| Gestor de paquetes | NuGet | Maven / Gradle |
| ORM | Entity Framework | Hibernate (JPA) |
| Tipos valor vs ref. | struct (valor en stack) vs class (referencia en heap) | Solo primitivos en stack; todo lo demás es referencia |
| Propiedades | Sintaxis nativa: get; set; | Getters/setters manuales o Lombok |
| Eventos | event + delegate nativo | Observer pattern manual / listeners |
| Async | async/await (C# 5, 2012) | CompletableFuture / Virtual Threads (Java 21) |
| LINQ | Consultas integradas en lenguaje | Stream API (Java 8) |
| Nullable ref types | C# 8+ (opt-in) | Optional<T> (Java 8) |
| Interoperabilidad | P/Invoke (C nativo), COM | JNI (Java Native Interface) |
TIPOS EN C#: struct vs class
| Aspecto | struct (tipo valor) | class (tipo referencia) |
|---|---|---|
| Almacenamiento | Stack (o inline si es campo de clase) | Heap (referencia en stack) |
| Asignación | Copia completa del valor | Copia de la referencia (alias) |
| Herencia | No (solo implementa interfaces) | Sí (herencia simple) |
| Nullable | No por defecto (usar Nullable<T> o T?) | Sí (puede ser null) |
| GC | No pasa por GC si vive en stack | Recogido por GC |
| Ejemplos BCL | int, double, DateTime, Guid | string, object, List<T> |
Pregunta recurrente: struct = tipo valor (stack), class = tipo referencia (heap). En Java NO existe el equivalente directo de struct (todo objeto va al heap).
COLECCIONES .NET
| Interfaz | Implementaciones | Equivalente Java |
|---|---|---|
IList<T> | List<T>, Array | ArrayList |
IDictionary<K,V> | Dictionary<K,V>, SortedDictionary<K,V> | HashMap, TreeMap |
ISet<T> | HashSet<T>, SortedSet<T> | HashSet, TreeSet |
IEnumerable<T> | Base de todas las colecciones (iterable) | Iterable<T> |
| Concurrente | ConcurrentDictionary, ConcurrentBag, ConcurrentQueue | ConcurrentHashMap, ConcurrentLinkedQueue |
LINQ (Language Integrated Query)
Fuente: Microsoft Learn — LINQ Documentation. LINQ permite escribir consultas sobre colecciones, XML, bases de datos, etc. directamente en C#.
| Sintaxis | Ejemplo |
|---|---|
| Query syntax | var result = from p in personas where p.Edad > 18 select p.Nombre; |
| Method syntax | var result = personas.Where(p => p.Edad > 18).Select(p => p.Nombre); |
| Operador LINQ | Función | Equivalente Stream Java |
|---|---|---|
Where() | Filtrar | filter() |
Select() | Proyectar/transformar | map() |
OrderBy() / OrderByDescending() | Ordenar | sorted() |
GroupBy() | Agrupar | Collectors.groupingBy() |
First() / FirstOrDefault() | Primer elemento | findFirst() |
Any() / All() | Existe / todos cumplen | anyMatch() / allMatch() |
Count() | Contar | count() |
ToList() / ToArray() | Materializar | collect(toList()) |
PERSISTENCIA: ADO.NET Y ENTITY FRAMEWORK
| Aspecto | ADO.NET | Entity Framework (EF Core) |
|---|---|---|
| Nivel | Bajo nivel — SQL directo | Alto nivel — ORM |
| Clases clave | SqlConnection, SqlCommand, SqlDataReader, DataSet | DbContext, DbSet<T>, entidades POCO |
| SQL | Escrito manualmente | Generado por LINQ to Entities / consultas LINQ |
| Mapeo | Manual: reader["columna"] | Automático: convenciones + anotaciones / Fluent API |
| Equivalente Java | JDBC | Hibernate / JPA |
| EF Core enfoque | Descripción |
|---|---|
| Code First | Definir clases C# → EF genera la base de datos (migraciones) |
| Database First | BD existente → EF genera clases C# (scaffold) |
| Migraciones | dotnet ef migrations add NombreMigracion → evolución incremental del esquema |
| Change Tracking | DbContext detecta automáticamente cambios en entidades cargadas |
| Lazy Loading | Relaciones cargadas al acceder (requiere paquete Proxies) |
ASP.NET CORE — WEB
Fuente: ASP.NET Core Documentation (learn.microsoft.com/aspnet). Framework web unificado, multiplataforma, open source.
| Modelo | Descripción | Cuándo usar |
|---|---|---|
| MVC | Model-View-Controller con Razor Views (.cshtml) | Aplicaciones web con vistas server-side |
| Razor Pages | Modelo page-based (PageModel + .cshtml) | Formularios, CRUD sencillos |
| Web API | Controllers que devuelven JSON/XML (RESTful) | APIs para SPAs, móviles, microservicios |
| Minimal APIs | Endpoints sin controllers, en Program.cs | Microservicios simples, prototipos (.NET 6+) |
| Blazor | SPA con C# en lugar de JavaScript | Devs C# que quieren UI interactiva sin JS |
| gRPC | RPC binario con Protocol Buffers | Comunicación inter-servicios de alto rendimiento |
| SignalR | Comunicación en tiempo real (WebSocket) | Chat, notificaciones, dashboards en vivo |
BLAZOR
| Modo Blazor | Dónde ejecuta C# | Ventaja |
|---|---|---|
| Blazor Server | En el servidor (SignalR envía diffs al DOM) | Carga rápida, acceso directo a recursos del servidor |
| Blazor WebAssembly | En el navegador (via WASM) | Offline, no requiere servidor para UI |
| Blazor United (.NET 8) | SSR + interactividad por componente | Lo mejor de ambos mundos, renderizado híbrido |
MIDDLEWARE Y PIPELINE ASP.NET CORE
| Concepto | Descripción |
|---|---|
| Middleware | Componente que procesa la petición HTTP en cadena (similar a Filters en Java) |
| Pipeline | Cadena de middlewares: Request → MW1 → MW2 → ... → Endpoint → ... → MW2 → MW1 → Response |
| Dependency Injection | Integrado nativamente en ASP.NET Core: builder.Services.AddScoped<IService, ServiceImpl>() |
| Configuration | appsettings.json + environment variables + secretos de usuario |
Program.cs | Punto de entrada (desde .NET 6: minimal hosting, sin Startup.cs) |
HERRAMIENTAS DE DESARROLLO
| Herramienta | Función |
|---|---|
| Visual Studio | IDE completo de Microsoft (Windows/Mac). IntelliSense, debugger, profiler |
| VS Code | Editor ligero con extensión C# Dev Kit |
| JetBrains Rider | IDE multiplataforma basado en IntelliJ + ReSharper |
| dotnet CLI | Herramienta de línea de comandos: dotnet new, dotnet build, dotnet run, dotnet test, dotnet publish |
| NuGet | Gestor de paquetes .NET. Repositorio: nuget.org. Config: *.csproj (<PackageReference>) |
| MSBuild | Motor de compilación que lee .csproj / .sln |
Tip examen: NuGet es el equivalente .NET de Maven/npm. Los paquetes se declaran en el archivo.csprojcomo<PackageReference>.
.NET ASPIRE
| Aspecto | Descripción |
|---|---|
| Qué es | Stack opinado para aplicaciones cloud-native .NET (desde .NET 8) |
| Orquestación | Arranca y conecta múltiples servicios + dependencias (Redis, PostgreSQL, etc.) para desarrollo local |
| Dashboard | Panel visual de telemetría: logs, traces, métricas OpenTelemetry |
| Service Discovery | Resolución automática de URLs entre servicios |
TESTING EN .NET
| Framework | Tipo | Uso |
|---|---|---|
| xUnit | Testing unitario | Estándar de facto en .NET moderno. Atributos: [Fact], [Theory] |
| NUnit | Testing unitario | Alternativa madura. [Test], [TestCase] |
| MSTest | Testing unitario | Framework de Microsoft. [TestMethod] |
| Moq | Mocking | Librería de mocks más popular |
| FluentAssertions | Assertions legibles | result.Should().Be(42) |
FUENTES PÚBLICAS
Este resumen ha sido elaborado íntegramente a partir de fuentes de dominio público. No se ha utilizado material con copyright de terceros ni material de preparadores.
| Fuente | Tipo | Referencia |
|---|---|---|
| Microsoft Learn — .NET Documentation | Documentación oficial | learn.microsoft.com/dotnet |
| C# Language Specification (ECMA-334) | Estándar | ecma-international.org |
| CLI Standard (ECMA-335) | Estándar | ecma-international.org |
| ASP.NET Core Documentation | Documentación oficial | learn.microsoft.com/aspnet |
| .NET Runtime (GitHub) | Código abierto (MIT) | github.com/dotnet/runtime |
| Entity Framework Core Documentation | Documentación oficial | learn.microsoft.com/ef |