Características de C# 14
Lo que realmente llegó en C# 14, con código.
Este pilar indexa todo lo que he escrito sobre las características del lenguaje C# 14: tipos unión, constructores y eventos partial, tipos de extensión, y las pequeñas mejoras ergonómicas que son fáciles de pasar por alto en las notas oficiales de la versión.
Qué leer primero
Empieza con los posts sobre tipos unión y miembros partial si vienes de C# 12 - son los cambios de comportamiento más grandes. Todo lo demás es calidad de vida.
Qué hay en esta página
La lista de abajo recopila automáticamente los posts etiquetados con alguno de: c# 14, csharp 14, c#, csharp, c# language. Los más recientes primero.
Índice (138 posts)
2026 / 05
- .NET 11 agrega captura de salida de procesos sin interbloqueos
.NET 11 Preview 4 incorpora nuevas APIs de System.Diagnostics.Process que drenan stdout y stderr en paralelo, además de helpers de una sola línea para ejecutar y capturar, y KillOnParentExit.
- Fix: A possible object cycle was detected
System.Text.Json se niega a serializar grafos con referencias cíclicas. Configura ReferenceHandler.IgnoreCycles, proyecta a un DTO o marca el puntero hacia atrás con [JsonIgnore]. Preserve es un último recurso.
- Solución: SqlException: Timeout expired durante migraciones de EF Core
Las migraciones usan el DbContext de diseño, no tu CommandTimeout de ejecución. Configura el tiempo de espera con UseSqlServer(o => o.CommandTimeout(...)), con Command Timeout en la cadena de conexión, o con Database.SetCommandTimeout antes de Migrate().
- Solución: System.Text.Json.JsonException: The JSON value could not be converted
System.Text.Json lanza esta excepción cuando el token JSON entrante no coincide con el tipo CLR de destino. Haz que el JSON coincida con el tipo, o registra un JsonConverter o una JsonSerializerOption que los reconcilie.
- Solución: System.Security.Cryptography.CryptographicException: Keyset does not exist
La clave privada del certificado reside en un archivo de claves de Windows que la identidad del proceso no puede leer. Ajusta la ACL, carga el PFX con MachineKeySet o usa EphemeralKeySet.
- Solución: System.IO.FileNotFoundException: Could not load file or assembly en una aplicación publicada
Funciona con dotnet run y falla tras dotnet publish. La DLL suele faltar en la carpeta de publicación, no en el runtime. Revise deps.json, Private en ProjectReference y el trimming.
- Solución: InvalidOperationException: Synchronous operations are disallowed
Reemplace la llamada Stream.Read o Write por ReadAsync/WriteAsync. Como último recurso, active AllowSynchronousIO en Kestrel, IIS o por solicitud con IHttpBodyControlFeature.
- Fix: RZ10012: Found markup element with unexpected name en Blazor
El compilador de Razor de Blazor emite RZ10012 cuando una etiqueta en PascalCase no tiene un tipo de componente correspondiente en el ámbito. Agrega @using para el namespace del componente en _Imports.razor, o @namespace en el componente, y recompila.
- Fix: dotnet ef migrations add falla con 'Unable to create an object of type DbContext'
Las herramientas en tiempo de diseño de EF Core no pudieron instanciar tu DbContext. Expón un host con WebApplication.CreateBuilder, apunta al startup project correcto o implementa IDesignTimeDbContextFactory.
- Fix: MSB3027 Could not copy X to Y. Exceeded retry count of 10. Failed
MSB3027 significa que MSBuild reintentó copiar un archivo 10 veces y un proceso seguía reteniendo el destino. Mata el proceso bloqueante, excluye bin/obj del antivirus o sube CopyRetryCount.
- Fix: The type or namespace name 'X' could not be found (después de añadir una referencia de proyecto)
CS0246 justo después de un ProjectReference recién añadido casi siempre es un desajuste de TargetFramework, una carpeta obj/ obsoleta o una directiva using ausente. Cinco soluciones en orden de probabilidad.
- Solución: Cannot consume scoped service 'X' from singleton 'Y'
La validación de ámbitos de ASP.NET Core lanza esto cuando un singleton capturaría una dependencia scoped durante todo el proceso. Haz que el consumidor sea scoped, o toma IServiceScopeFactory y crea un ámbito bajo demanda.
- Fix: PlatformNotSupportedException: Operation is not supported on this platform en Native AOT
Native AOT elimina el JIT y el intérprete, así que reflection emit, compilación de árboles de expresión y MakeGenericType no vistos lanzan en runtime. Localiza la llamada con IL3050 y reemplázala por un generador de código fuente o un camino prehorneado.
- Solución: Unable to resolve service for type 'X' while attempting to activate 'Y'
ASP.NET Core lanza esta excepción cuando un constructor pide un tipo que nunca se registró, se registró en el contenedor equivocado, o se agregó después de construir el host. Tres soluciones concretas cubren casi todos los casos.
- Fix: TaskCanceledException: A task was canceled en HttpClient
HttpClient lanza TaskCanceledException por tres razones distintas: timeout, cancelación del llamador o un aborto a nivel de conexión. Distínguelos con InnerException y CancellationToken.IsCancellationRequested, y luego corrige el correcto.
- Fix: The JSON value could not be converted to System.DateTime
System.Text.Json solo acepta cadenas ISO 8601 para DateTime. Envía 2026-05-08T14:00:00Z o registra un JsonConverter que parsee tu formato. Cadenas vacías y timestamps Unix también lanzan.
- Los workflows de Microsoft Agent Framework ahora sobreviven a reinicios de proceso gracias al stack Durable Task
Envuelve un Workflow de Agent Framework en Microsoft.Agents.AI.DurableTask y cada paso de ejecutor queda con checkpoint. Caída, redeploy, reinicio: la ejecución continúa donde se detuvo.
- Solución: The instance of entity type cannot be tracked because another instance with the same key value is already being tracked
EF Core 11 lanza esta excepción cuando dos objetos comparten clave primaria dentro de un DbContext. Desvincula el viejo o actualízalo en el lugar. AsNoTracking en la lectura previene la colisión.
- Solución: A second operation was started on this context instance before a previous operation completed
EF Core lanza esta excepción cuando dos await corren en paralelo sobre el mismo DbContext. Espera cada llamada de forma secuencial, u obtén un DbContext nuevo por unidad de trabajo concurrente vía IDbContextFactory.
- Microsoft Agent Framework controla las llamadas a herramientas riesgosas con FunctionApprovalRequestContent
Envuelve un AIFunction en ApprovalRequiredAIFunction y el agente se detiene a mitad de la ejecución para pedir permiso. Así funciona el flujo de solicitud y respuesta en C#.
- Solución: System.InvalidOperationException: No connection string named 'DefaultConnection' could be found
Si GetConnectionString devuelve null en .NET 11, a tu appsettings.json le falta la clave, no se copia a la salida del build, o se está seleccionando el archivo de entorno equivocado. Tres comprobaciones resuelven el 95% de los casos.
- Cómo convertir T[] a ReadOnlyMemory<T> en C# (operador implícito y constructor explícito)
Tres formas de envolver un T[] en un ReadOnlyMemory<T> en .NET 11: la conversión implícita, el constructor explícito y AsMemory(). Cuándo cada una es la opción correcta.
- Cómo implementar arrastrar y soltar en .NET MAUI 11
Arrastrar y soltar de extremo a extremo en .NET MAUI 11: DragGestureRecognizer, DropGestureRecognizer, cargas útiles personalizadas con DataPackage, AcceptedOperation, posición del gesto y las trampas de PlatformArgs por plataforma en Android, iOS, Mac Catalyst y Windows.
- Cómo soportar el modo oscuro correctamente en una aplicación .NET MAUI
Modo oscuro de extremo a extremo en .NET MAUI 11: AppThemeBinding, SetAppThemeColor, RequestedTheme, anulación con UserAppTheme y persistencia, el evento RequestedThemeChanged y los detalles por plataforma de Info.plist y MainActivity que la documentación pasa por alto.
- Cómo usar Tailwind CSS con Blazor WebAssembly en .NET 11
Configuración completa en .NET 11 para Tailwind CSS v4 en una app Blazor WebAssembly: CLI standalone (sin Node), target de MSBuild, directivas @source para archivos Razor y CSS isolation, y un pipeline de publish que sobrevive a Native AOT.
- Cómo detectar consultas N+1 en EF Core 11
Una guía práctica para identificar consultas N+1 en EF Core 11: cómo aparece el patrón en código real, cómo exponerlo mediante registros, interceptores de diagnóstico, OpenTelemetry y una prueba que rompe la compilación cuando una ruta crítica regresa.
- Cómo usar consultas compiladas con EF Core en rutas calientes
Una guía práctica de las consultas compiladas en EF Core 11: cuándo EF.CompileAsyncQuery realmente gana, el patrón de campo estático, las trampas con Include y tracking, y cómo medir antes y después para demostrar que el ceremonial extra valió la pena.
- Cómo escribir una app MAUI que solo corra en Windows y macOS (sin móvil)
Quita Android e iOS de un proyecto .NET MAUI 11 para que solo se publique para Windows y Mac Catalyst: las ediciones del csproj, los comandos de workload y la multiplataforma que mantiene el código limpio.
- Cómo configurar registro estructurado con Serilog y Seq en .NET 11
Una guía completa para conectar Serilog 4.x y Seq 2025.2 en una aplicación ASP.NET Core de .NET 11: AddSerilog vs UseSerilog, registro de arranque en dos etapas, configuración JSON, enrichers, registro de solicitudes, correlación de trazas con OpenTelemetry, claves de API y los problemas de producción relacionados con buffering, retención y nivel de señal.
- Cómo usar OpenTelemetry con .NET 11 y un backend gratuito
Conecta trazas, métricas y logs de OpenTelemetry en una aplicación ASP.NET Core .NET 11 con el exportador OTLP, y luego envíalos a un backend gratuito y autoalojado: el Aspire Dashboard standalone para desarrollo local, Jaeger y SigNoz para producción autoalojada, y el OpenTelemetry Collector cuando necesites ambos.
- Cómo escribir pruebas de integración contra un SQL Server real con Testcontainers
Una guía completa para ejecutar pruebas de integración de ASP.NET Core contra un SQL Server 2022 real usando Testcontainers 4.11 y EF Core 11: cableado de WebApplicationFactory, IAsyncLifetime, sustitución del registro del DbContext, aplicación de migraciones, paralelismo, limpieza con Ryuk y trampas de CI.
2026 / 04
- Cómo agregar rate limiting por endpoint en ASP.NET Core 11
Una guía completa de rate limiting por endpoint en ASP.NET Core 11: cuándo elegir fixed window vs sliding window vs token bucket vs concurrency, en qué se diferencian RequireRateLimiting y [EnableRateLimiting], cómo particionar por usuario o IP, el callback OnRejected, y la trampa de despliegue distribuido en la que cae todo el mundo.
- Cómo usar el nuevo tipo System.Threading.Lock en .NET 11
System.Threading.Lock llegó en .NET 9 y es la primitiva de sincronización por defecto en .NET 11 y C# 14. Esta guía muestra cómo migrar desde lock(object), cómo funciona EnterScope y los problemas alrededor de await, dynamic y los targets antiguos.
- Cómo escribir un generador de código fuente para INotifyPropertyChanged
Una guía completa para construir tu propio generador de código fuente incremental para INotifyPropertyChanged en C# 14 y .NET 11: la pipeline IIncrementalGenerator, atributos marcadores, salida de partial class, el patrón SetProperty y cómo mantener la compatibilidad con AOT.
- Como detectar cuando un archivo termina de escribirse en .NET
FileSystemWatcher dispara Changed antes de que el escritor termine. Tres patrones confiables para .NET 11 para saber que un archivo esta totalmente escrito: abrir con FileShare.None, hacer debounce con estabilizacion de tamano y el truco de renombrado del lado del productor que evita el problema por completo.
- Cómo compartir la lógica de validación entre el servidor y Blazor WebAssembly
La mayor fuente de divergencia en la validación entre un cliente Blazor WebAssembly y una API ASP.NET Core es la tentación de escribir las reglas dos veces. Esta guía recorre la única estructura que escala en .NET 11: una biblioteca de clases Shared que posee los DTO y sus validadores, consumida por el cliente WASM (EditForm + DataAnnotationsValidator o Blazored.FluentValidation) y por el servidor (filtro de endpoint en minimal API o model binding de MVC), con un viaje de ida y vuelta probado que vuelca los ValidationProblemDetails del servidor en el EditContext.
- Cómo usar SearchValues<T> correctamente en .NET 11
SearchValues<T> supera a IndexOfAny entre 5x y 250x, pero solo si lo usas como espera el runtime. La regla de cachear como static, la trampa de StringComparison, cuándo no vale la pena, y el truco de inversión con IndexOfAnyExcept que nadie documenta.
- Cómo usar Native AOT con APIs mínimas de ASP.NET Core
Un recorrido completo para .NET 11 sobre cómo enviar una API mínima de ASP.NET Core con Native AOT: PublishAot, CreateSlimBuilder, JSON con generador de código fuente, la limitación de AddControllers, advertencias IL2026 / IL3050, y EnableRequestDelegateGenerator para proyectos de biblioteca.
- Cómo precalentar el modelo de EF Core antes de la primera consulta
EF Core construye su modelo conceptual de forma diferida en el primer acceso al DbContext, por lo que la primera consulta en un proceso recién iniciado es varios cientos de milisegundos más lenta que cualquier consulta posterior. Esta guía cubre las tres soluciones reales en EF Core 11: un IHostedService de arranque que toca Model y abre una conexión, dotnet ef dbcontext optimize para enviar un modelo precompilado, y las trampas de la clave de caché que reconstruyen el modelo silenciosamente.
- Cómo añadir un filtro global de excepciones en ASP.NET Core 11
Guía completa de manejo global de excepciones en ASP.NET Core 11: por qué IExceptionFilter es la herramienta equivocada, cómo IExceptionHandler y UseExceptionHandler funcionan juntos, respuestas con ProblemDetails, cadenas de varios manejadores y el cambio disruptivo de .NET 10 sobre la supresión de diagnósticos.
- Cómo construir un servidor MCP personalizado en C# sobre .NET 11
Construye un servidor Model Context Protocol funcional en C# 14 / .NET 11 usando el SDK oficial ModelContextProtocol 1.2. Cubre el transporte stdio, los atributos [McpServerTool], inyección de dependencias, la trampa del logging por stderr y el registro con Claude Code, Claude Desktop y VS Code.
- Cómo simular DbContext sin romper el rastreo de cambios
Simular DbContext directamente rompe silenciosamente el ChangeTracker, por eso Microsoft lo desaconseja. Esta guía muestra los dos patrones que sí funcionan en EF Core 11: SQLite en memoria con una conexión que se mantiene abierta para que se ejecute el ChangeTracker real, y el patrón repositorio que saca por completo a EF Core de la prueba.
- Cómo hacer pruebas unitarias de código que usa HttpClient
Una guía completa para probar HttpClient en .NET 11: por qué no debes mockear HttpClient directamente, cómo escribir un HttpMessageHandler de stub, intercambiar el handler primario con IHttpClientFactory, verificar reintentos de Polly, y la opción WireMock.Net.
- Cómo usar Channels en lugar de BlockingCollection en C#
System.Threading.Channels es el reemplazo asíncrono de BlockingCollection en .NET 11. Esta guía muestra cómo migrar, cómo elegir entre acotado y no acotado, y cómo manejar contrapresión, cancelación y apagado controlado sin interbloqueos.
- Cómo escribir un JsonConverter personalizado en System.Text.Json
Una guía completa para escribir un JsonConverter<T> personalizado para System.Text.Json en .NET 11: cuándo realmente necesitas uno, cómo navegar correctamente Utf8JsonReader, cómo manejar genéricos con JsonConverterFactory y cómo mantenerlo compatible con AOT.
- Cómo generar código cliente fuertemente tipado desde una especificación OpenAPI en .NET 11
Usa Kiota, el generador oficial de OpenAPI de Microsoft, para producir un cliente C# fluent y fuertemente tipado desde cualquier especificación OpenAPI. Paso a paso: instalar, generar, conectar a la inyección de dependencias de ASP.NET Core y gestionar la autenticación.
- Cómo cancelar una Task de larga duración en C# sin interbloquear
Cancelación cooperativa con CancellationToken, CancelAsync, Task.WaitAsync y tokens enlazados en .NET 11. Más los patrones de bloqueo que convierten una cancelación limpia en un interbloqueo.
- Cómo usar IAsyncEnumerable<T> con EF Core 11
Las consultas de EF Core 11 implementan IAsyncEnumerable<T> directamente. Aquí está cómo hacer streaming de filas con await foreach, cuándo preferirlo sobre ToListAsync, y las trampas alrededor de conexiones, tracking y cancelación.
- Cómo usar records con EF Core 11 correctamente
Una guía práctica para mezclar records de C# y EF Core 11. Dónde encajan los records, dónde rompen el change tracking, y cómo modelar value objects, entidades y proyecciones sin pelearte con el framework.
- Addons de Node.js en C#: .NET Native AOT reemplaza a C++ y node-gyp
El equipo de C# Dev Kit cambió su addon C++ de Node.js por una librería .NET 10 Native AOT, usando N-API, UnmanagedCallersOnly y LibraryImport para producir un único archivo .node sin Python ni node-gyp.
- Cómo devolver múltiples valores desde un método en C# 14
Siete formas de devolver más de un valor desde un método en C# 14: tuplas con nombre, parámetros out, records, structs, desestructuración y el truco de los extension members para tipos que no te pertenecen. Benchmarks reales y una matriz de decisión al final.
- RyuJIT poda más bounds checks en .NET 11 Preview 3: index-from-end y i + constante
.NET 11 Preview 3 enseña a RyuJIT a eliminar bounds checks redundantes en accesos consecutivos index-from-end y en patrones i + constante < length, reduciendo presión de branches en loops apretados.
- RegexOptions.AnyNewLine aterriza en .NET 11 Preview 3: anchors Unicode-aware sin los hacks de \r?
.NET 11 Preview 3 agrega RegexOptions.AnyNewLine para que ^, $, \Z, y . reconozcan toda secuencia de newline Unicode, incluyendo \r\n, NEL, LS, y PS, con \r\n tratado como un break atómico.
- EF Core 11 poda joins de referencia innecesarios en split queries
EF Core 11 Preview 3 remueve joins to-one redundantes de split queries y tira claves ORDER BY innecesarias. Un escenario reportado se volvió 29% más rápido, otro 22%. Así se ve el SQL ahora.
- System.Text.Json en .NET 11 Preview 3 añade PascalCase y políticas de naming por miembro
.NET 11 Preview 3 termina la historia de políticas de naming en System.Text.Json: JsonNamingPolicy.PascalCase, un atributo [JsonNamingPolicy] a nivel de miembro, y un [JsonIgnore] por defecto a nivel de tipo para DTOs más limpios.
- EF Core 11 agrega GetEntriesForState para saltarse DetectChanges
EF Core 11 Preview 3 introduce ChangeTracker.GetEntriesForState, un enumerador filtrado por state que evita un pase extra de DetectChanges en hot paths como interceptors de SaveChanges y hooks de audit.
- Construyendo un motor de base de datos de latencia de microsegundos en C#
El proyecto Typhon de Loic Baumann apunta a commits ACID de 1-2 microsegundos usando ref structs, intrínsecos de hardware y memoria fijada, demostrando que C# puede competir a nivel de programación de sistemas.
- Operadores de asignación compuesta definidos por el usuario en C# 14: += in-place sin la asignación extra
C# 14 te deja sobrecargar +=, -=, *= y compañía como métodos de instancia void que mutan al receptor in-place, recortando asignaciones para holders de valores grandes como buffers tipo BigInteger y tensores.
- Cómo los parámetros nvarchar default de Dapper matan silenciosamente tus índices de SQL Server
Los strings de C# enviados vía Dapper hacen default a nvarchar(4000), forzando a SQL Server a implicit conversions y scans completos de índice. Acá cómo arreglarlo con DbType.AnsiString.
- .NET 11 agrega compresión Zstandard nativa a System.IO.Compression
.NET 11 Preview 1 incluye ZstandardStream, ZstandardEncoder y ZstandardDecoder en System.IO.Compression, dándote soporte zstd rápido e integrado sin paquetes de terceros.
- EF Core 11 te permite crear y aplicar una migración en un solo comando
El comando dotnet ef database update ahora acepta --add para crear y aplicar una migración en un solo paso. Aquí está cómo funciona, por qué importa para contenedores y .NET Aspire, y qué tener en cuenta.
- EF Core 11 agrega búsqueda vectorial nativa de SQL Server con índices DiskANN
EF Core 11 Preview 2 soporta VECTOR_SEARCH() de SQL Server 2025 y los índices vectoriales DiskANN directamente desde LINQ. Aquí está cómo configurar el índice, ejecutar consultas aproximadas, y qué cambia del enfoque VectorDistance de EF Core 10.
- ReSharper aterriza en VS Code y Cursor, gratis para uso no comercial
JetBrains lanzó ReSharper como una extensión de VS Code con análisis de C#, refactorización y pruebas unitarias completas. Funciona también en Cursor y Google Antigravity, y no cuesta nada para OSS y aprendizaje.
- Los tipos de unión de C# 15 están aquí: las uniones de tipo llegan en .NET 11 Preview 2
C# 15 introduce la palabra clave union para uniones de tipo con coincidencia de patrones exhaustiva y conversiones implícitas. Disponible ahora en .NET 11 Preview 2.
- Microsoft Agent Framework 1.0: construyendo agentes de IA en C# puro
Microsoft Agent Framework llega a 1.0 con APIs estables, conectores multi-proveedor, orquestación multi-agente, e interoperabilidad A2A/MCP. Aquí está cómo se ve en la práctica en .NET 10.
- Runtime Async de .NET 11 reemplaza las state machines con trazas de pila más limpias
Runtime Async en .NET 11 mueve el manejo de async/await de las state machines generadas por el compilador al runtime mismo, produciendo trazas de pila legibles, breakpoints correctos, y menos asignaciones en heap.
2026 / 02
- Miembros de extensión en C# 14: propiedades, operadores y miembros estáticos de extensión
C# 14 introduce miembros de extensión, lo que te permite agregar propiedades, operadores y miembros estáticos de extensión a tipos existentes usando la nueva palabra clave extension.
- Idea para C# 14: los interceptores podrían hacer que la generación de código fuente de System.Text.Json se sienta automática
Una discusión de la comunidad propuso usar interceptores de C# 14 para reescribir las llamadas a JsonSerializer de modo que utilicen automáticamente un JsonSerializerContext generado, manteniendo la generación de código fuente compatible con AOT y con sitios de llamada más limpios.
- Asignación condicional nula en C# 14: usar ?. y ?[] en el lado izquierdo
C# 14 extiende los operadores condicionales nulos para que funcionen en el lado izquierdo de las asignaciones, eliminando verificaciones de null verbosas al asignar propiedades o indexadores.
- Polars.NET: un motor de DataFrame en Rust para .NET 10 que se apoya en LibraryImport
Un nuevo proyecto Polars.NET es tendencia después de un post de la comunidad del 6 de febrero de 2026. El titular es simple: una API DataFrame amigable con .NET respaldada por Rust Polars, con un ABI C estable e interop basada en LibraryImport para mantener el overhead bajo.
2026 / 01
- Una app de notas "solo local" en WinUI 3 es el tipo correcto de aburrida: offline-first, SQLite, primero el teclado
Miyanyedi Quick Note es una app de notas en WinUI 3 + SQLite que es offline-first y respetuosa con la privacidad. Aquí va por qué solo local es una característica, más un snippet mínimo de SQLite para apps de escritorio en .NET 8.
- CV Shortlist: un SaaS .NET 10 con IA se volvió open-source, y el stack vale la pena estudiarlo
CV Shortlist es un SaaS .NET 10 open-source que combina Azure Document Intelligence con un modelo de OpenAI. El stack, la disciplina de configuración y la frontera de integración con IA valen la pena estudiarlos.
- ModularPipelines V3: escribe pipelines de CI en C#, depura localmente y deja de niñear YAML
ModularPipelines V3 te permite escribir pipelines de CI en C# en lugar de YAML. Ejecútalos localmente con dotnet run, obtén seguridad en tiempo de compilación y depura con puntos de interrupción.
- Microsoft `mcp`: cableando servidores Model Context Protocol desde C# en .NET 10
Cómo cablear servidores Model Context Protocol (MCP) en C# sobre .NET 10 usando microsoft/mcp. Cubre contratos de herramientas, validación de entradas, autenticación, observabilidad y patrones listos para producción.
- C# 13: el fin de las asignaciones de `params`
C# 13 finalmente elimina la asignación oculta de arrays detrás de params. Ahora puedes usar params con Span, ReadOnlySpan, List y otros tipos de colección para métodos variádicos sin asignaciones.
- Propuesta de C#: uniones discriminadas
Un vistazo a la propuesta de uniones discriminadas en C#: la palabra clave union, coincidencia de patrones exhaustiva y cómo podría reemplazar bibliotecas como OneOf y jerarquías de clases.
2025 / 04
- C# 14: Parámetros simplificados con modificadores en lambdas
C# 14 permite usar los modificadores ref, out, in, scoped y ref readonly en parámetros de lambda con tipo implícito, eliminando la necesidad de declarar explícitamente los tipos de los parámetros.
- Constructores y eventos parciales en C# 14
C# 14 te permite declarar constructores de instancia y eventos como miembros parciales, dividiendo las definiciones entre archivos para una generación de código más limpia y una mejor separación de responsabilidades.
- C# 14: soporte de nameof para tipos genéricos no enlazados
C# 14 mejora la expresión nameof para admitir tipos genéricos no enlazados como List<> y Dictionary<,>, eliminando la necesidad de argumentos de tipo de relleno.
- Conversiones implícitas de Span en C# 14: soporte de primera clase para Span y ReadOnlySpan
C# 14 añade conversiones implícitas integradas entre Span, ReadOnlySpan, arreglos y strings, permitiendo APIs más limpias, mejor inferencia de tipos y menos llamadas manuales a AsSpan().
- C# 14: la palabra clave field y las propiedades respaldadas por field
C# 14 introduce la palabra clave contextual field en los accesores de propiedades, lo que te permite añadir lógica personalizada a las auto-properties sin declarar un campo de respaldo aparte.
2025 / 01
- Rendimiento en .NET: ToList vs ToArray
.NET 9 mejora considerablemente el rendimiento de ToArray usando InlineArray, haciéndolo más rápido y eficiente en memoria que ToList. Mira los benchmarks comparando .NET 8 vs .NET 9.
- C# 13: Usa colecciones params con cualquier tipo de colección reconocido
C# 13 extiende el modificador params más allá de los arrays para soportar Span, ReadOnlySpan, IEnumerable y otros tipos de colecciones, reduciendo el código repetitivo y mejorando la flexibilidad.
- Cómo cambiar a C# 13
Cómo arreglar 'Feature is not available in C# 12.0' y cambiar tu proyecto a C# 13 modificando el target framework o configurando LangVersion en tu archivo .csproj.
2024 / 12
- Qué hay de nuevo en C# 14.0
Un resumen de todas las nuevas características de C# 14.0, incluyendo la palabra clave field, los miembros de extensión, la asignación condicional de null, las conversiones implícitas de span y más.
- Historial de versiones del lenguaje C#
La evolución de C# lo ha transformado en un lenguaje moderno y de alto rendimiento. Esta guía recorre cada hito importante. Los primeros años (C# 1.0 - 1.2). C# se lanzó en 2002 como lenguaje principal para .NET Framework. Se sentía como Java pero con un enfoque en el desarrollo en Windows. La versión 1.2 llegó poco después con pequeñas...
2023 / 11
- C# Elegir aleatoriamente elementos de una lista
En C#, puedes seleccionar aleatoriamente elementos de una lista usando Random.GetItems, un método introducido en .NET 8. Aprende cómo funciona con ejemplos prácticos.
- MAUI: Cómo registrar handlers en una biblioteca
Aprende a registrar view handlers y servicios desde dentro de una biblioteca de .NET MAUI usando el patrón builder y los métodos de extensión de MauiAppBuilder.
- Cómo solucionar: 'Point' no tiene un tamaño predefinido, por lo tanto sizeof solo se puede usar en un contexto unsafe
Soluciona el error de C# en el que sizeof no se puede usar con Point fuera de un contexto unsafe. Dos soluciones: habilitar código unsafe o usar Marshal.SizeOf.
- C# Acceder al campo de respaldo de una propiedad privada usando Unsafe Accessor
Usa UnsafeAccessorAttribute en .NET 8 para acceder a los campos de respaldo autogenerados de propiedades automáticas privadas en C# sin reflexión.
- C# Archivos ZIP a Stream
.NET 8 incluye nuevas sobrecargas de CreateFromDirectory y ExtractToDirectory que te permiten crear y extraer archivos ZIP directamente desde y hacia un Stream, sin escribir en disco.
- Rendimiento de .NET 8: GetGenericTypeDefinition 10 veces más rápido
Las pruebas de GetGenericTypeDefinition en .NET 8 frente a .NET 7 muestran un rendimiento casi 10 veces mayor. Mira el código del benchmark y los resultados con BenchmarkDotNet.
- Cómo tomar una captura de pantalla en .NET core
Aprende a capturar una imagen de todo tu escritorio desde una aplicación de consola .NET usando System.Windows.Forms. Solución solo para Windows que cubre todos los monitores.
- C# Cómo actualizar un campo readonly usando UnsafeAccessor
Aprende a actualizar un campo readonly en C# usando UnsafeAccessor, una alternativa a la reflexión sin la penalización de rendimiento. Disponible en .NET 8.
- Rendimiento de .NET 8: UnsafeAccessor vs. Reflection
Benchmark de UnsafeAccessor frente a Reflection en .NET 8. Mira cómo UnsafeAccessor logra rendimiento sin sobrecarga comparado con la reflexión tradicional.
2023 / 10
- C# Cómo marcar características como experimentales
A partir de C# 12, un nuevo ExperimentalAttribute te permite marcar tipos, métodos, propiedades o ensamblados como experimentales. Aprende a usarlo con diagnosticId, etiquetas pragma y UrlFormat.
- C# parámetros ref readonly
El modificador ref readonly en C# ofrece una forma más transparente de pasar referencias de solo lectura. Aprende cómo mejora al modificador in con mejores restricciones y visibilidad para quien llama.
- C# ¿Cómo barajar un array?
La forma más sencilla de barajar un array en C# es usando Random.Shuffle, introducido en .NET 8. Funciona in-place tanto con arrays como con spans.
- C# ¿Qué es una NullReferenceException y cómo arreglarla?
Aprende qué provoca una NullReferenceException en C#, cómo depurarla y cómo prevenirla usando comprobaciones de null, el operador null-conditional y los tipos de referencia anulables.
- Añadir/quitar TypeInfoResolver de un JsonSerializerOptions existente
Aprende a añadir o quitar instancias de TypeInfoResolver en un JsonSerializerOptions existente usando la nueva propiedad TypeInfoResolverChain en .NET 8.
- C# 12 Interceptors
Aprende sobre los interceptors de C# 12, una característica experimental del compilador en .NET 8 que te permite reemplazar llamadas a métodos en tiempo de compilación usando el atributo InterceptsLocation.
2023 / 09
- Implementation type Data.AppDbContext can't be converted to service type Microsoft.AspNetCore.Identity.IUserStore
Arregla el error de ASP.NET Core Identity en el que AppDbContext no se puede convertir a IUserStore añadiendo AddEntityFrameworkStores a tu configuración de identidad.
- .NET 8 serializar propiedades de jerarquías de interfaces
.NET 8 añade soporte para serializar propiedades de jerarquías de interfaces, incluyendo todas las propiedades de todas las interfaces según el tipo de la variable declarada.
- .NET 8 deserializar en propiedades no públicas
Aprende a deserializar JSON en propiedades no públicas en .NET 8 usando el atributo JsonInclude y constructores parametrizados.
- .NET 8 cómo usar JsonStringEnumConverter con native AOT
Aprende a usar el nuevo JsonStringEnumConverter<TEnum> en .NET 8 para una serialización de enums compatible con native AOT en System.Text.Json.
- The type or namespace name InterceptsLocationAttribute could not be found
Cómo arreglar el error CS0246 para InterceptsLocationAttribute en los interceptors de C# definiendo tú mismo el atributo.
- .NET 8 marcar JsonSerializerOptions como readonly
Aprende a marcar instancias de JsonSerializerOptions como de solo lectura en .NET 8 usando MakeReadOnly y a comprobar la propiedad IsReadOnly.
- .NET 8 serialización de Half, Int128 y UInt128
System.Text.Json en .NET 8 añade soporte integrado de serialización para los tipos numéricos Half, Int128 y UInt128.
- .NET 8 Memory<byte> se serializa como base64
A partir de .NET 8, tanto Memory<byte> como ReadOnlyMemory<byte> se serializan como cadenas Base64, mientras que otros tipos como Memory<int> siguen como arrays JSON.
- .NET 8 incluir miembros no públicos en la serialización JSON
Aprende a incluir propiedades private, protected e internal en la serialización JSON en .NET 8 usando el atributo JsonInclude.
2023 / 08
- C# 12 Inline arrays
Los inline arrays te permiten crear un array de tamaño fijo dentro de un tipo struct. Esa struct, con un buffer inline, ofrece un rendimiento comparable al de un buffer unsafe de tamaño fijo. Los inline arrays están pensados sobre todo para ser utilizados por el equipo del runtime y por algunos autores de librerías para mejorar el rendimiento en ciertos escenarios. Probablemente...
- C# 12 expresiones de colección
C# 12 introduce una nueva sintaxis simplificada para crear arrays. Tiene este aspecto: Es importante señalar que el tipo del array hay que especificarlo de forma explícita, por lo que no puedes usar var para declarar la variable. De forma similar, si quisieras crear un Span<int>, puedes hacer: Arrays multidimensionales Las ventajas de esta sintaxis concisa...
- C# ¿Cómo esperar a que termine un proceso?
Puedes usar el método WaitForExit para esperar a que el proceso se complete. Tu código esperará de forma síncrona hasta que el proceso termine y entonces continuará la ejecución. Veamos un ejemplo: El código anterior inicia un nuevo proceso cmd.exe y ejecuta el comando timeout 5. La llamada a process.WaitForExit() obligará a tu programa...
- C# 12 alias para cualquier tipo
La directiva using alias se ha flexibilizado en C# 12 para permitir crear alias de cualquier tipo, no solo de tipos con nombre. Esto significa que ahora puedes crear alias de tuplas, punteros, tipos de array, tipos genéricos, etc. Así, en lugar de usar la forma estructural completa de una tupla, puedes ponerle un alias corto y descriptivo...
- ¿Existe en C# un equivalente a la sentencia With...End With?
La sentencia With...End With de VB te permite ejecutar una serie de instrucciones que se refieren repetidamente a un mismo objeto, usando una sintaxis simplificada para acceder a sus miembros. ¿Existe un equivalente en C#? No. Lo más parecido serían los inicializadores de objetos, pero solo sirven para crear instancias nuevas.
2023 / 07
- C# 12 - Constructores primarios
A partir de C# 12, es posible definir un constructor primario en clases y structs. Los parámetros se colocan entre paréntesis justo después del nombre del tipo. Estos parámetros tienen un alcance amplio: pueden inicializar propiedades o campos, servir como variables en métodos o funciones locales, y pasarse a un constructor base.
2023 / 06
- Cómo empezar a programar con C#
Una guía para principiantes sobre cómo empezar a programar en C#, desde la instalación de Visual Studio hasta escribir tu primer programa y encontrar recursos para aprender.
- Cómo cambiar a C# 12
Resuelve los errores de versión de lenguaje C# 12 actualizando tu target framework a .NET 8 o configurando LangVersion en tu archivo .csproj.
- Novedades de C# 12
Una visión general de las nuevas características de C# 12, incluyendo constructores primarios, parámetros lambda por defecto, expresiones de colección, inline arrays y más.
2023 / 05
- C# 12 - Valores por defecto para parámetros en expresiones lambda
C# 12 te permite especificar valores por defecto para los parámetros y arrays params en expresiones lambda, igual que en métodos y funciones locales.
2023 / 03
- C# 11 - Atributos genéricos
Aprende a definir y usar atributos genéricos en C# 11, incluyendo las restricciones sobre los argumentos de tipo y los mensajes de error más comunes.
- C# 11 - modificador de acceso file y tipos con ámbito de archivo
Aprende cómo el modificador file de C# 11 restringe el ámbito de un tipo al archivo en el que se declara, ayudando a evitar colisiones de nombres con los source generators.
- C# 11 - Literales raw string interpolados
Aprende a usar literales raw string interpolados en C# 11, incluyendo el escape de llaves, varios caracteres $ y operadores condicionales.
- Literales raw string en C# 11 (sintaxis con triple comilla)
Usa los literales raw string de C# 11 (sintaxis con triple comilla `"""`) para incrustar espacios en blanco, saltos de línea y comillas sin secuencias de escape. Reglas y ejemplos.
- Cómo cambiar a C# 11
Soluciona el error 'Feature is not available in C# 10.0' cambiando a C# 11 mediante el target framework o LangVersion en tu archivo .csproj.
- C# lanzar excepción si es null: ArgumentNullException.ThrowIfNull (.NET 6+)
Usa ArgumentNullException.ThrowIfNull en .NET 6+ para comprobaciones de null concisas, o utiliza expresiones throw en C# 7+ para frameworks anteriores.
2020 / 11
- Obtener el stream de un Embedded Resource en .NET Core
Aprende a obtener el stream de un recurso embebido en .NET Core entendiendo cómo se compone el nombre del recurso y usando GetManifestResourceStream.
- Cómo usar appsettings.json con Xamarin.Forms
Aprende a usar archivos de configuración appsettings.json con Xamarin.Forms incrustando el archivo como recurso y construyendo un objeto IConfiguration.
- Cómo exponer públicamente tu servicio local de SignalR para clientes móviles usando ngrok
Usa ngrok para exponer públicamente tu servicio local de SignalR de modo que los clientes móviles puedan conectarse sin configuración de red ni soluciones temporales para SSL.
2020 / 05
- C# using var (using declaration)
Usa las using declarations de C# 8 (`using var`) para liberar objetos IDisposable sin llaves anidadas. Sintaxis, reglas de ámbito y cuándo preferir bloques `using`.
2020 / 04
- Asignación de fusión nula ??= en C# 8.0
Aprende cómo funciona el operador de asignación de fusión nula (??=) de C# 8.0, con ejemplos prácticos como caché y asignaciones condicionales.
2019 / 01
- Animar fondos con Xamarin Forms
Crea un efecto de fondo animado y fluido en Xamarin Forms usando animaciones ScaleTo sobre BoxViews superpuestos.
2013 / 10
- Cuánto tarda un PC en contar hasta un billón
Benchmarking de cuánto tarda un PC en contar hasta un billón y más allá, con resultados actualizados de 2023.
2013 / 06
- Añadir reconocimiento de voz a tu app WP8
Añade reconocimiento de voz a tu app de Windows Phone 8 usando el control SpeechTextBox del Windows Phone toolkit.
- Actualizar periódicamente tus live tiles con ScheduledTaskAgent
Usa un ScheduledTaskAgent para actualizar periódicamente las live tiles de tu Windows Phone desde un feed RSS.
2013 / 05
- Crear wide tiles para tu app de Windows Phone 7
Crea wide live tiles tanto para Windows Phone 7 como para 8 usando la librería MangoPollo con una única pieza de código.
2012 / 01
- C#: convertir Hex a Color
Un método de extensión en C# que convierte códigos de color en hex (formatos RGB y ARGB) a objetos Color.
- Mejora tu productividad usando code snippets
Aprende cómo los code snippets de Visual Studio pueden mejorar tu productividad permitiéndote insertar piezas de código reutilizables mediante un alias corto.