Recursos do C# 14
O que de fato chegou no C# 14, com código.
Este pilar indexa tudo o que escrevi sobre os recursos da linguagem C# 14: tipos união, construtores e eventos partial, tipos de extensão, e os pequenos ganhos ergonômicos que passam despercebidos nas notas oficiais da versão.
Por onde começar
Comece pelos posts sobre tipos união e membros partial se você está vindo do C# 12 - são as mudanças de comportamento mais significativas. O resto é qualidade de vida.
O que tem nesta página
A lista abaixo coleta automaticamente os posts com qualquer uma das tags: c# 14, csharp 14, c#, csharp, c# language. Mais recentes primeiro.
Índice (138 posts)
2026 / 05
- .NET 11 adiciona captura de saída de processos livre de deadlock
.NET 11 Preview 4 traz novas APIs em System.Diagnostics.Process que drenam stdout e stderr em paralelo, helpers de uma linha para executar e capturar, e KillOnParentExit.
- Fix: A possible object cycle was detected
System.Text.Json se recusa a serializar grafos com referências circulares. Configure ReferenceHandler.IgnoreCycles, projete para um DTO, ou marque o ponteiro de volta com [JsonIgnore]. Preserve é último recurso.
- Correção: SqlException: Timeout expired durante migrações do EF Core
As migrações usam o DbContext de tempo de design, não o seu CommandTimeout de runtime. Defina o timeout via UseSqlServer(o => o.CommandTimeout(...)), o Command Timeout da string de conexão, ou Database.SetCommandTimeout antes de Migrate().
- Fix: System.Text.Json.JsonException: The JSON value could not be converted
System.Text.Json lança esta exceção quando o token JSON recebido não corresponde ao tipo CLR de destino. Faça o JSON corresponder ao tipo, ou registre um JsonConverter ou uma JsonSerializerOption que os reconcilie.
- Solução: System.Security.Cryptography.CryptographicException: Keyset does not exist
A chave privada do certificado mora em um arquivo de chaves do Windows que a identidade do processo não consegue ler. Ajuste a ACL, carregue o PFX com MachineKeySet ou use EphemeralKeySet.
- Correção: System.IO.FileNotFoundException: Could not load file or assembly em um app publicado
Funciona com dotnet run, falha após dotnet publish. A DLL geralmente está faltando na pasta de publicação, não no runtime. Verifique deps.json, Private em ProjectReference e trimming.
- Correção: InvalidOperationException: Synchronous operations are disallowed
Substitua a chamada Stream.Read ou Write por ReadAsync/WriteAsync. Como último recurso, defina AllowSynchronousIO no Kestrel, IIS ou por requisição via IHttpBodyControlFeature.
- Fix: RZ10012: Found markup element with unexpected name no Blazor
O compilador Razor do Blazor emite RZ10012 quando uma tag em PascalCase não tem um tipo de componente correspondente no escopo. Adicione @using para o namespace do componente em _Imports.razor, ou @namespace no componente, e recompile.
- Fix: dotnet ef migrations add falha com 'Unable to create an object of type DbContext'
As ferramentas em tempo de design do EF Core não conseguiram instanciar seu DbContext. Exponha um host com WebApplication.CreateBuilder, aponte para o startup project correto ou implemente IDesignTimeDbContextFactory.
- Fix: MSB3027 Could not copy X to Y. Exceeded retry count of 10. Failed
MSB3027 significa que o MSBuild tentou copiar um arquivo 10 vezes e algum processo ainda retinha o destino. Mate o processo bloqueador, exclua bin/obj do antivírus ou aumente CopyRetryCount.
- Fix: The type or namespace name 'X' could not be found (depois de adicionar uma referência de projeto)
CS0246 logo após um ProjectReference recém-adicionado quase sempre é um descompasso de TargetFramework, uma pasta obj/ desatualizada ou uma diretiva using ausente. Cinco correções em ordem de probabilidade.
- Correção: Cannot consume scoped service 'X' from singleton 'Y'
A validação de escopo do ASP.NET Core lança esta exceção quando um singleton capturaria uma dependência scoped pelo resto do processo. Torne o consumidor scoped, ou injete IServiceScopeFactory e crie um escopo sob demanda.
- Fix: PlatformNotSupportedException: Operation is not supported on this platform em Native AOT
Native AOT remove o JIT e o interpretador, então reflection emit, compilação de árvores de expressão e MakeGenericType desconhecidos lançam em runtime. Encontre a chamada via IL3050 e troque por um gerador de código-fonte ou um caminho pré-pronto.
- Correção: Unable to resolve service for type 'X' while attempting to activate 'Y'
O ASP.NET Core lança esta exceção quando um construtor pede um tipo que nunca foi registrado, foi registrado no contêiner errado ou foi adicionado depois que o host foi construído. Três correções concretas cobrem quase todos os casos.
- Correção: TaskCanceledException: A task was canceled no HttpClient
O HttpClient lança TaskCanceledException por três motivos diferentes: timeout, cancelamento pelo chamador ou um aborto em nível de conexão. Diferencie-os com InnerException e CancellationToken.IsCancellationRequested e corrija o motivo certo.
- Fix: The JSON value could not be converted to System.DateTime
System.Text.Json só aceita strings ISO 8601 para DateTime. Envie 2026-05-08T14:00:00Z ou registre um JsonConverter que parseie seu formato. Strings vazias e timestamps Unix também lançam.
- Os workflows do Microsoft Agent Framework agora sobrevivem a reinícios de processo via o stack Durable Task
Embrulhe um Workflow do Agent Framework em Microsoft.Agents.AI.DurableTask e cada passo de executor recebe checkpoint. Crash, redeploy, restart: a execução continua de onde parou.
- Correção: The instance of entity type cannot be tracked because another instance with the same key value is already being tracked
EF Core 11 lança essa exceção quando dois objetos compartilham a chave primária dentro de um DbContext. Desanexe o antigo ou atualize-o no lugar. AsNoTracking na leitura evita a colisão.
- Correção: A second operation was started on this context instance before a previous operation completed
EF Core lança esta exceção quando dois await rodam em paralelo sobre o mesmo DbContext. Aguarde cada chamada de forma sequencial, ou obtenha um DbContext novo por unidade de trabalho concorrente via IDbContextFactory.
- Microsoft Agent Framework controla chamadas de ferramentas arriscadas com FunctionApprovalRequestContent
Envolva um AIFunction em ApprovalRequiredAIFunction e o agente para no meio da execução para pedir permissão. Veja como funciona o fluxo de requisição e resposta em C#.
- Correção: System.InvalidOperationException: No connection string named 'DefaultConnection' could be found
Se GetConnectionString retorna null no .NET 11, o seu appsettings.json não tem a chave, não está sendo copiado para a saída do build, ou o arquivo de ambiente errado está sendo selecionado. Três checagens resolvem 95% dos casos.
- Como converter T[] para ReadOnlyMemory<T> em C# (operador implícito e construtor explícito)
Três formas de envolver um T[] em um ReadOnlyMemory<T> no .NET 11: a conversão implícita, o construtor explícito e AsMemory(). Quando cada uma é a escolha certa.
- Como implementar arrastar e soltar no .NET MAUI 11
Arrastar e soltar de ponta a ponta no .NET MAUI 11: DragGestureRecognizer, DropGestureRecognizer, payloads personalizados de DataPackage, AcceptedOperation, posição do gesto e as armadilhas de PlatformArgs por plataforma no Android, iOS, Mac Catalyst e Windows.
- Como suportar o modo escuro corretamente em um aplicativo .NET MAUI
Modo escuro de ponta a ponta no .NET MAUI 11: AppThemeBinding, SetAppThemeColor, RequestedTheme, sobrescrita com UserAppTheme e persistência, o evento RequestedThemeChanged e os ajustes por plataforma do Info.plist e MainActivity que a documentação deixa passar.
- Como usar Tailwind CSS com Blazor WebAssembly no .NET 11
Uma configuração completa do .NET 11 para Tailwind CSS v4 em um app Blazor WebAssembly: CLI standalone (sem Node), target do MSBuild, diretivas @source para arquivos Razor e de isolamento de CSS, e um pipeline de publicação que sobrevive ao Native AOT.
- Como detectar consultas N+1 no EF Core 11
Um guia prático para identificar consultas N+1 no EF Core 11: como o padrão aparece em código real, como expô-lo via logs, interceptadores de diagnóstico, OpenTelemetry e um teste que quebra o build quando um caminho crítico regride.
- Como usar consultas compiladas no EF Core em hot paths
Um guia prático sobre consultas compiladas no EF Core 11: quando EF.CompileAsyncQuery realmente vence, o padrão de campo estático, as armadilhas com Include e tracking, e como medir antes e depois para provar que valeu a pena a cerimônia extra.
- Como escrever um app MAUI que roda apenas no Windows e macOS (sem mobile)
Tire Android e iOS de um projeto .NET MAUI 11 para que ele publique apenas Windows e Mac Catalyst: as edições no csproj, os comandos de workload e o multi-targeting que mantém o código limpo.
- Como configurar logging estruturado com Serilog e Seq no .NET 11
Um guia completo para conectar Serilog 4.x e Seq 2025.2 em uma aplicação ASP.NET Core do .NET 11: AddSerilog vs UseSerilog, bootstrap logging em duas etapas, configuração JSON, enrichers, request logging, correlação de traces com OpenTelemetry, API keys e os problemas de produção envolvendo buffering, retenção e nível de sinal.
- Como usar OpenTelemetry com .NET 11 e um backend gratuito
Conecte traces, métricas e logs do OpenTelemetry em uma aplicação ASP.NET Core .NET 11 com o exportador OTLP, e envie os dados para um backend gratuito e auto-hospedado: o Aspire Dashboard standalone para desenvolvimento local, Jaeger e SigNoz para produção auto-hospedada, e o OpenTelemetry Collector quando você precisar dos dois.
- Como escrever testes de integração contra um SQL Server real com Testcontainers
Um guia completo para rodar testes de integração de ASP.NET Core contra um SQL Server 2022 real usando Testcontainers 4.11 e EF Core 11: configuração de WebApplicationFactory, IAsyncLifetime, troca do registro do DbContext, aplicação de migrations, paralelismo, limpeza com Ryuk e armadilhas de CI.
2026 / 04
- Como adicionar rate limiting por endpoint no ASP.NET Core 11
Um guia completo de rate limiting por endpoint no ASP.NET Core 11: quando escolher fixed window vs sliding window vs token bucket vs concurrency, como RequireRateLimiting e [EnableRateLimiting] diferem, particionamento por usuário ou IP, o callback OnRejected, e a armadilha de implantação distribuída em que todo mundo cai.
- Como usar o novo tipo System.Threading.Lock no .NET 11
System.Threading.Lock chegou no .NET 9 e é a primitiva de sincronização padrão no .NET 11 e C# 14. Este guia mostra como migrar de lock(object), como o EnterScope funciona e os problemas em torno de await, dynamic e targets antigos.
- Como escrever um gerador de código-fonte para INotifyPropertyChanged
Um guia completo para construir seu próprio gerador de código-fonte incremental para INotifyPropertyChanged em C# 14 e .NET 11: a pipeline IIncrementalGenerator, atributos marcadores, saída de partial class, o padrão SetProperty e como manter compatibilidade com AOT.
- Como detectar quando um arquivo termina de ser escrito no .NET
FileSystemWatcher dispara Changed antes do escritor terminar. Tres padroes confiaveis para .NET 11 para saber quando um arquivo esta totalmente escrito: abrir com FileShare.None, fazer debounce com estabilizacao de tamanho e o truque de renomeacao do lado do produtor que evita o problema completamente.
- Como compartilhar lógica de validação entre o servidor e o Blazor WebAssembly
A maior fonte de divergência de validação entre um cliente Blazor WebAssembly e uma API ASP.NET Core é a tentação de escrever as regras duas vezes. Este guia percorre a única estrutura que escala em .NET 11: uma biblioteca de classes Shared que detém os DTOs e seus validadores, consumida tanto pelo cliente WASM (EditForm + DataAnnotationsValidator ou Blazored.FluentValidation) quanto pelo servidor (filtro de endpoint em minimal API ou model binding do MVC), com um round-trip testado que devolve os ValidationProblemDetails do servidor para o EditContext.
- Como usar SearchValues<T> corretamente no .NET 11
SearchValues<T> supera IndexOfAny em 5x a 250x, mas só quando você o usa do jeito que o runtime espera. A regra de cachear como static, a pegadinha do StringComparison, quando não vale a pena e o truque de inversão com IndexOfAnyExcept que ninguém documenta.
- Como usar Native AOT com APIs mínimas do ASP.NET Core
Um passo a passo completo para .NET 11 que envia uma API mínima do ASP.NET Core com Native AOT: PublishAot, CreateSlimBuilder, JSON com gerador de código-fonte, a limitação do AddControllers, avisos IL2026 / IL3050 e EnableRequestDelegateGenerator para projetos de biblioteca.
- Como aquecer o modelo do EF Core antes da primeira consulta
O EF Core constrói seu modelo conceitual de forma preguiçosa no primeiro acesso ao DbContext, o que faz a primeira consulta de um processo recém-iniciado ser várias centenas de milissegundos mais lenta do que qualquer consulta seguinte. Este guia cobre as três soluções reais no EF Core 11: um IHostedService de inicialização que toca Model e abre uma conexão, dotnet ef dbcontext optimize para entregar um modelo pré-compilado, e as armadilhas da chave de cache que reconstroem o modelo silenciosamente mesmo assim.
- Como adicionar um filtro global de exceções no ASP.NET Core 11
Guia completo de tratamento global de exceções no ASP.NET Core 11: por que IExceptionFilter é a ferramenta errada, como IExceptionHandler e UseExceptionHandler funcionam juntos, respostas com ProblemDetails, cadeias de múltiplos handlers e a mudança de comportamento do .NET 10 sobre supressão de diagnósticos.
- Como construir um servidor MCP customizado em C# no .NET 11
Construa um servidor Model Context Protocol funcional em C# 14 / .NET 11 usando o SDK oficial ModelContextProtocol 1.2. Cobre transporte stdio, atributos [McpServerTool], injeção de dependência, a armadilha do logging em stderr e o registro com Claude Code, Claude Desktop e VS Code.
- Como simular o DbContext sem quebrar o rastreamento de alterações
Simular o DbContext diretamente quebra silenciosamente o ChangeTracker, e por isso a Microsoft desencoraja essa prática. Este guia mostra os dois padrões que realmente funcionam no EF Core 11: SQLite em memória com uma conexão mantida aberta para que o ChangeTracker real seja executado, e o padrão repositório, que tira o EF Core inteiramente do teste.
- Como fazer testes unitários de código que usa HttpClient
Um guia completo para testar HttpClient no .NET 11: por que você não deve mockar HttpClient diretamente, como escrever um HttpMessageHandler de stub, trocar o handler primário com IHttpClientFactory, verificar retentativas do Polly e a opção WireMock.Net.
- Como usar Channels em vez de BlockingCollection em C#
System.Threading.Channels é o substituto assíncrono de BlockingCollection no .NET 11. Este guia mostra como migrar, como escolher entre limitado e ilimitado, e como lidar com backpressure, cancelamento e desligamento controlado sem deadlocks.
- Como escrever um JsonConverter customizado em System.Text.Json
Um guia completo para escrever JsonConverter<T> customizado para System.Text.Json no .NET 11: quando você realmente precisa de um, como navegar pelo Utf8JsonReader corretamente, como lidar com tipos genéricos usando JsonConverterFactory e como manter compatibilidade com AOT.
- Como Gerar Código de Cliente Fortemente Tipado a partir de uma Especificação OpenAPI no .NET 11
Use o Kiota, o gerador oficial de OpenAPI da Microsoft, para produzir um cliente C# fluent e fortemente tipado a partir de qualquer especificação OpenAPI. Passo a passo: instalar, gerar, conectar à injeção de dependência do ASP.NET Core e gerenciar autenticação.
- Como cancelar uma Task de longa duração em C# sem causar deadlock
Cancelamento cooperativo com CancellationToken, CancelAsync, Task.WaitAsync e tokens ligados no .NET 11. Mais os padrões de bloqueio que transformam um cancelamento limpo em deadlock.
- Como usar IAsyncEnumerable<T> com EF Core 11
As queries do EF Core 11 implementam IAsyncEnumerable<T> diretamente. Veja como fazer streaming de linhas com await foreach, quando preferir a ToListAsync, e as pegadinhas envolvendo conexões, tracking e cancelamento.
- Como usar records com EF Core 11 corretamente
Um guia prático para misturar records do C# e EF Core 11. Onde records se encaixam, onde eles quebram o change tracking, e como modelar value objects, entidades e projeções sem brigar com o framework.
- Addons Node.js em C#: .NET Native AOT substitui C++ e node-gyp
O time do C# Dev Kit trocou seu addon Node.js C++ por uma biblioteca .NET 10 Native AOT, usando N-API, UnmanagedCallersOnly e LibraryImport para produzir um único arquivo .node sem Python nem node-gyp.
- Como retornar múltiplos valores de um método em C# 14
Sete formas de retornar mais de um valor de um método em C# 14: tuplas nomeadas, parâmetros out, records, structs, desestruturação e o truque de extension member para tipos que não são seus. Benchmarks reais e uma matriz de decisão no final.
- RyuJIT poda mais bounds checks no .NET 11 Preview 3: index-from-end e i + constante
.NET 11 Preview 3 ensina ao RyuJIT a eliminar bounds checks redundantes em acessos consecutivos index-from-end e em padrões i + constante < length, cortando pressão de branches em loops apertados.
- RegexOptions.AnyNewLine chega no .NET 11 Preview 3: anchors Unicode-aware sem os hacks de \r?
.NET 11 Preview 3 adiciona RegexOptions.AnyNewLine para que ^, $, \Z, e . reconheçam toda sequência de newline Unicode, incluindo \r\n, NEL, LS, e PS, com \r\n tratado como um break atômico.
- EF Core 11 poda joins de referência desnecessários em split queries
EF Core 11 Preview 3 remove joins to-one redundantes de split queries e derruba chaves ORDER BY desnecessárias. Um cenário relatado ficou 29% mais rápido, outro 22%. Aqui está como o SQL fica agora.
- System.Text.Json no .NET 11 Preview 3 adiciona PascalCase e políticas de naming por membro
.NET 11 Preview 3 fecha a história de políticas de naming no System.Text.Json: JsonNamingPolicy.PascalCase, um atributo [JsonNamingPolicy] em nível de membro, e um default [JsonIgnore] em nível de tipo para DTOs mais limpos.
- EF Core 11 adiciona GetEntriesForState pra pular DetectChanges
EF Core 11 Preview 3 introduz ChangeTracker.GetEntriesForState, um enumerador filtrado por state que evita um pass extra de DetectChanges em hot paths como interceptors de SaveChanges e hooks de audit.
- Construindo um motor de banco de dados de latência de microssegundos em C#
O projeto Typhon de Loic Baumann mira commits ACID de 1-2 microssegundos usando ref structs, intrínsecos de hardware e memória fixada, provando que C# pode competir no nível de programação de sistemas.
- Operadores de atribuição composta definidos pelo usuário no C# 14: += in-place sem a alocação extra
C# 14 deixa você sobrecarregar +=, -=, *= e companhia como métodos de instância void que mutam o receptor in-place, cortando alocações para holders de valor grandes como buffers estilo BigInteger e tensores.
- Como os parâmetros nvarchar padrão do Dapper matam silenciosamente seus índices SQL Server
Strings de C# enviadas via Dapper viram nvarchar(4000) por padrão, forçando o SQL Server a conversões implícitas e scans completos de índice. Aqui como consertar com DbType.AnsiString.
- .NET 11 adiciona compressão Zstandard nativa ao System.IO.Compression
.NET 11 Preview 1 entrega ZstandardStream, ZstandardEncoder e ZstandardDecoder no System.IO.Compression, oferecendo suporte zstd rápido e integrado sem pacotes de terceiros.
- EF Core 11 permite criar e aplicar uma migração em um único comando
O comando dotnet ef database update agora aceita --add para criar e aplicar uma migração em um único passo. Veja como funciona, por que importa para containers e .NET Aspire, e o que observar.
- EF Core 11 adiciona busca vetorial nativa do SQL Server com índices DiskANN
EF Core 11 Preview 2 suporta o VECTOR_SEARCH() do SQL Server 2025 e os índices vetoriais DiskANN diretamente do LINQ. Veja como configurar o índice, executar consultas aproximadas, e o que muda da abordagem VectorDistance do EF Core 10.
- ReSharper chega ao VS Code e Cursor, grátis para uso não comercial
A JetBrains lançou o ReSharper como uma extensão do VS Code com análise de C#, refatoração e testes unitários completos. Funciona também no Cursor e no Google Antigravity, e não custa nada para OSS e aprendizado.
- Os tipos union do C# 15 chegaram: type unions são entregues no .NET 11 Preview 2
C# 15 introduz a palavra-chave union para type unions com correspondência de padrões exaustiva e conversões implícitas. Disponível agora no .NET 11 Preview 2.
- Microsoft Agent Framework 1.0: construindo agentes de IA em C# puro
Microsoft Agent Framework chega ao 1.0 com APIs estáveis, conectores multi-provedor, orquestração multi-agente, e interoperabilidade A2A/MCP. Veja como fica na prática no .NET 10.
- Runtime Async do .NET 11 substitui state machines com stack traces mais limpos
Runtime Async no .NET 11 move o tratamento de async/await das state machines geradas pelo compilador para o próprio runtime, produzindo stack traces legíveis, breakpoints corretos, e menos alocações no heap.
2026 / 02
- Membros de extensão em C# 14: propriedades, operadores e membros estáticos de extensão
C# 14 introduz membros de extensão, permitindo adicionar propriedades, operadores e membros estáticos de extensão a tipos existentes usando a nova palavra-chave extension.
- Ideia para C# 14: interceptors poderiam fazer a geração de código-fonte do System.Text.Json parecer automática
Uma discussão da comunidade propôs usar interceptors do C# 14 para reescrever chamadas ao JsonSerializer de modo que utilizem automaticamente um JsonSerializerContext gerado, mantendo a geração de código-fonte amigável a AOT com pontos de chamada mais limpos.
- Atribuição condicional nula em C# 14: usando ?. e ?[] no lado esquerdo
C# 14 estende os operadores condicionais nulos para funcionarem no lado esquerdo de atribuições, eliminando verificações de null verbosas ao definir propriedades ou indexadores.
- Polars.NET: um motor de DataFrame em Rust para .NET 10 que se apoia em LibraryImport
Um novo projeto Polars.NET está em alta depois de um post da comunidade em 6 de fevereiro de 2026. A manchete é simples: uma API DataFrame amigável ao .NET apoiada pelo Polars em Rust, com um ABI C estável e interop baseada em LibraryImport para manter o overhead baixo.
2026 / 01
- Um app de notas "apenas local" em WinUI 3 é o tipo certo de entediante: offline-first, SQLite, teclado em primeiro lugar
Miyanyedi Quick Note é um app de notas em WinUI 3 + SQLite, offline-first e amigável à privacidade. Eis por que apenas local é um recurso, além de um snippet mínimo de SQLite para apps desktop em .NET 8.
- CV Shortlist: um SaaS .NET 10 com IA virou open-source, e a stack vale a pena estudar
CV Shortlist é um SaaS .NET 10 open-source que combina Azure Document Intelligence com um modelo da OpenAI. A stack, a disciplina de configuração e a fronteira de integração com IA valem o estudo.
- ModularPipelines V3: escreva pipelines de CI em C#, depure localmente e pare de babá de YAML
ModularPipelines V3 permite escrever pipelines de CI em C# em vez de YAML. Execute-os localmente com dotnet run, obtenha segurança em tempo de compilação e depure com breakpoints.
- Microsoft `mcp`: ligando servidores Model Context Protocol a partir de C# no .NET 10
Como ligar servidores Model Context Protocol (MCP) em C# no .NET 10 usando microsoft/mcp. Cobre contratos de ferramentas, validação de entrada, autenticação, observabilidade e padrões prontos para produção.
- C# 13: o fim das alocações de `params`
O C# 13 finalmente elimina a alocação oculta de array por trás de params. Agora você pode usar params com Span, ReadOnlySpan, List e outros tipos de coleção para métodos variádicos sem alocação.
- Proposta do C#: discriminated unions
Um olhar sobre a proposta de discriminated unions do C#: a palavra-chave union, correspondência de padrões exaustiva e como ela pode substituir bibliotecas OneOf e hierarquias de classes.
2025 / 04
- C# 14: Parâmetros simplificados com modificadores em lambdas
O C# 14 permite usar os modificadores ref, out, in, scoped e ref readonly em parâmetros de lambda com tipo implícito, eliminando a necessidade de declarar explicitamente os tipos dos parâmetros.
- Construtores e eventos parciais no C# 14
O C# 14 permite declarar construtores de instância e eventos como membros parciais, dividindo definições entre arquivos para uma geração de código mais limpa e melhor separação de responsabilidades.
- C# 14: suporte do nameof para tipos genéricos não vinculados
C# 14 aprimora a expressão nameof para suportar tipos genéricos não vinculados como List<> e Dictionary<,>, eliminando a necessidade de argumentos de tipo de preenchimento.
- Conversões implícitas de Span em C# 14: suporte de primeira classe para Span e ReadOnlySpan
C# 14 adiciona conversões implícitas integradas entre Span, ReadOnlySpan, arrays e strings, possibilitando APIs mais limpas, melhor inferência de tipos e menos chamadas manuais a AsSpan().
- C# 14: a palavra-chave field e propriedades respaldadas por field
C# 14 introduz a palavra-chave contextual field nos acessadores de propriedades, permitindo adicionar lógica personalizada às auto-properties sem declarar um campo de apoio separado.
2025 / 01
- Desempenho no .NET: ToList vs ToArray
O .NET 9 melhora significativamente o desempenho de ToArray usando InlineArray, tornando-o mais rápido e eficiente em memória do que ToList. Veja benchmarks comparando .NET 8 vs .NET 9.
- C# 13: Use coleções params com qualquer tipo de coleção reconhecido
C# 13 estende o modificador params para além de arrays e suporta Span, ReadOnlySpan, IEnumerable e outros tipos de coleção, reduzindo boilerplate e melhorando a flexibilidade.
- Como mudar para C# 13
Como corrigir 'Feature is not available in C# 12.0' e mudar seu projeto para C# 13 alterando o target framework ou definindo LangVersion no seu arquivo .csproj.
2024 / 12
- O que há de novo no C# 14.0
Um resumo de todos os novos recursos do C# 14.0, incluindo a palavra-chave field, membros de extensão, atribuição condicional a null, conversões implícitas de span e muito mais.
- Histórico de versões da linguagem C#
A evolução do C# o transformou em uma linguagem moderna e de alto desempenho. Este guia acompanha cada marco importante. Os primeiros anos (C# 1.0 - 1.2). O C# foi lançado em 2002 como linguagem primária para o .NET Framework. Parecia com Java, mas com foco no desenvolvimento Windows. A versão 1.2 chegou logo depois com pequenas...
2023 / 11
- C# Escolher itens aleatoriamente de uma lista
Em C#, você pode selecionar aleatoriamente itens de uma lista usando Random.GetItems, um método introduzido no .NET 8. Aprenda como funciona com exemplos práticos.
- MAUI: Como registrar handlers em uma biblioteca
Aprenda a registrar view handlers e serviços de dentro de uma biblioteca .NET MAUI usando o padrão builder e os métodos de extensão do MauiAppBuilder.
- Como resolver: 'Point' não tem um tamanho predefinido, portanto sizeof só pode ser usado em um contexto unsafe
Resolva o erro de C# em que sizeof não pode ser usado com Point fora de um contexto unsafe. Duas soluções: habilitar código unsafe ou usar Marshal.SizeOf.
- C# Acessar o campo de apoio de uma propriedade privada usando Unsafe Accessor
Use UnsafeAccessorAttribute no .NET 8 para acessar os campos de apoio autogerados de propriedades automáticas privadas em C# sem reflexão.
- C# arquivos ZIP para Stream
.NET 8 inclui novas sobrecargas de CreateFromDirectory e ExtractToDirectory que permitem criar e extrair arquivos ZIP diretamente para e a partir de um Stream, sem gravar em disco.
- Desempenho do .NET 8: GetGenericTypeDefinition 10x mais rápido
Benchmarks de GetGenericTypeDefinition no .NET 8 contra o .NET 7 mostram desempenho quase 10x melhor. Veja o código do benchmark e os resultados com BenchmarkDotNet.
- Como tirar um screenshot no .NET core
Aprenda a capturar um screenshot de toda a área de trabalho a partir de uma aplicação de console .NET usando System.Windows.Forms. Solução só para Windows que cobre todos os monitores.
- C# como atualizar um campo readonly usando UnsafeAccessor
Aprenda a atualizar um campo readonly em C# usando UnsafeAccessor, uma alternativa à reflexão sem a penalidade de desempenho. Disponível no .NET 8.
- Desempenho do .NET 8: UnsafeAccessor vs. Reflection
Benchmark de UnsafeAccessor contra Reflection no .NET 8. Veja como UnsafeAccessor entrega desempenho sem overhead em comparação com a reflexão tradicional.
2023 / 10
- C# como marcar recursos como experimentais
A partir do C# 12, um novo ExperimentalAttribute permite marcar tipos, métodos, propriedades ou assemblies como experimentais. Aprenda a usá-lo com diagnosticId, tags pragma e UrlFormat.
- C# parâmetros ref readonly
O modificador ref readonly no C# oferece uma forma mais transparente de passar referências somente leitura. Veja como ele melhora o modificador in, com restrições mais claras e visibilidade para quem chama.
- C# como embaralhar um array?
A forma mais fácil de embaralhar um array em C# é usar Random.Shuffle, introduzido no .NET 8. Funciona in-place tanto em arrays quanto em spans.
- C# o que é uma NullReferenceException e como corrigir?
Entenda o que causa uma NullReferenceException em C#, como debugar e como prevenir usando checagens de null, o operador null-conditional e tipos de referência anuláveis.
- Adicionar/remover TypeInfoResolver em um JsonSerializerOptions existente
Aprenda a adicionar ou remover instâncias de TypeInfoResolver em um JsonSerializerOptions existente usando a nova propriedade TypeInfoResolverChain do .NET 8.
- C# 12 Interceptors
Conheça os interceptors do C# 12, um recurso experimental do compilador no .NET 8 que permite substituir chamadas de método em tempo de compilação usando o atributo InterceptsLocation.
2023 / 09
- Implementation type Data.AppDbContext can't be converted to service type Microsoft.AspNetCore.Identity.IUserStore
Corrija o erro do ASP.NET Core Identity em que AppDbContext não pode ser convertido em IUserStore adicionando AddEntityFrameworkStores na sua configuração de identidade.
- .NET 8 serializando propriedades de hierarquias de interfaces
O .NET 8 passa a suportar a serialização de propriedades de hierarquias de interfaces, incluindo todas as propriedades de todas as interfaces conforme o tipo declarado da variável.
- .NET 8 desserializar em propriedades não públicas
Aprenda a desserializar JSON em propriedades não públicas no .NET 8 usando o atributo JsonInclude e construtores parametrizados.
- .NET 8 como usar JsonStringEnumConverter com native AOT
Aprenda a usar o novo JsonStringEnumConverter<TEnum> no .NET 8 para serializar enums no System.Text.Json de forma compatível com native AOT.
- The type or namespace name InterceptsLocationAttribute could not be found
Como corrigir o erro CS0246 do InterceptsLocationAttribute nos interceptors do C# definindo o atributo você mesmo.
- .NET 8 marcando JsonSerializerOptions como readonly
Aprenda a marcar instâncias de JsonSerializerOptions como somente leitura no .NET 8 usando MakeReadOnly e a verificar a propriedade IsReadOnly.
- .NET 8 serialização de Half, Int128 e UInt128
O System.Text.Json no .NET 8 adiciona suporte nativo de serialização para os tipos numéricos Half, Int128 e UInt128.
- .NET 8 Memory<byte> é serializado como base64
A partir do .NET 8, tanto Memory<byte> quanto ReadOnlyMemory<byte> são serializados como strings Base64, enquanto outros tipos como Memory<int> continuam como arrays JSON.
- .NET 8 incluindo membros não públicos na serialização JSON
Aprenda a incluir propriedades private, protected e internal na serialização JSON no .NET 8 usando o atributo JsonInclude.
2023 / 08
- C# 12 Inline arrays
Inline arrays permitem criar um array de tamanho fixo dentro de uma struct. Uma struct desse tipo, com um buffer inline, deve entregar desempenho comparável a um buffer unsafe de tamanho fixo. Inline arrays são pensados principalmente para o time do runtime e alguns autores de bibliotecas, para melhorar o desempenho em certos cenários. Provavelmente...
- C# 12 expressões de coleção
O C# 12 traz uma nova sintaxe simplificada para criar arrays. Fica assim: É importante notar que o tipo do array precisa ser especificado explicitamente, então você não pode usar var para declarar a variável. De forma parecida, se você quiser criar um Span<int>: Arrays multidimensionais As vantagens dessa sintaxe enxuta...
- C# como esperar um processo terminar?
Você pode usar o método WaitForExit para esperar o processo finalizar. Seu código espera de forma síncrona até o processo terminar e então retoma a execução. Veja um exemplo: O código acima inicia um novo processo cmd.exe e executa o comando timeout 5. A chamada process.WaitForExit() força o programa...
- C# 12 alias para qualquer tipo
A diretiva using alias foi relaxada no C# 12 para permitir criar alias para qualquer tipo, não apenas tipos nomeados. Isso significa que agora você pode criar alias para tuples, pointers, tipos de array, tipos genéricos, etc. Assim, em vez de usar a forma estrutural completa de um tuple, dá para criar um alias curto e descritivo...
- Existe em C# um equivalente à instrução With...End With?
A instrução With...End With do VB permite executar uma série de comandos que se referem repetidamente a um único objeto, usando uma sintaxe simplificada para acessar seus membros. Existe um equivalente em C#? Não. O mais próximo seriam os inicializadores de objeto, mas eles só servem para instanciar objetos novos.
2023 / 07
- C# 12 - Construtores primários
A partir do C# 12, é possível definir um construtor primário em classes e structs. Os parâmetros ficam entre parênteses logo após o nome do tipo. Eles têm um escopo amplo: podem inicializar propriedades ou campos, servir como variáveis em métodos ou funções locais e ser passados para um construtor base.
2023 / 06
- Como começar a programar com C#
Um guia para iniciantes sobre como começar a programar em C#, desde a configuração do Visual Studio até escrever seu primeiro programa e encontrar recursos de aprendizado.
- Como mudar para o C# 12
Resolva os erros de versão da linguagem C# 12 atualizando seu target framework para o .NET 8 ou definindo LangVersion no seu arquivo .csproj.
- O que há de novo no C# 12
Uma visão geral dos novos recursos do C# 12, incluindo construtores primários, parâmetros lambda padrão, expressões de coleção, inline arrays e mais.
2023 / 05
- C# 12 - Valores padrão para parâmetros em expressões lambda
O C# 12 permite especificar valores padrão para parâmetros e arrays params em expressões lambda, assim como em métodos e funções locais.
2023 / 03
- C# 11 - Atributos genéricos
Aprenda a definir e usar atributos genéricos no C# 11, incluindo restrições nos argumentos de tipo e mensagens de erro comuns.
- C# 11 - modificador de acesso file e tipos com escopo de arquivo
Aprenda como o modificador file do C# 11 restringe o escopo de um tipo ao arquivo em que é declarado, ajudando a evitar colisões de nomes com source generators.
- C# 11 - Literais raw string interpolados
Aprenda a usar literais raw string interpolados no C# 11, incluindo escape de chaves, vários caracteres $ e operadores condicionais.
- Literais raw string no C# 11 (sintaxe de aspas triplas)
Use os literais raw string do C# 11 (sintaxe de aspas triplas `"""`) para incorporar espaços em branco, quebras de linha e aspas sem sequências de escape. Regras e exemplos.
- Como mudar para o C# 11
Resolva o erro 'Feature is not available in C# 10.0' migrando para o C# 11 via target framework ou LangVersion no seu arquivo .csproj.
- C# lançar exceção se for null: ArgumentNullException.ThrowIfNull (.NET 6+)
Use ArgumentNullException.ThrowIfNull no .NET 6+ para checagens concisas de null, ou use expressões throw no C# 7+ para frameworks mais antigos.
2020 / 11
- Obter o stream de um Embedded Resource no .NET Core
Aprenda a obter o stream de um recurso embutido no .NET Core entendendo como o nome do recurso é formado e usando GetManifestResourceStream.
- Como usar appsettings.json com Xamarin.Forms
Aprenda a usar arquivos de configuração appsettings.json com Xamarin.Forms embutindo o arquivo como recurso e construindo um objeto IConfiguration.
- Como expor publicamente seu serviço SignalR local para clientes móveis usando ngrok
Use o ngrok para expor publicamente seu serviço SignalR local para que clientes móveis possam se conectar sem configuração de rede ou contornos de SSL.
2020 / 05
- C# using var (using declaration)
Use as using declarations do C# 8 (`using var`) para descartar objetos IDisposable sem chaves aninhadas. Sintaxe, regras de escopo e quando preferir blocos `using`.
2020 / 04
- Atribuição de coalescência nula ??= no C# 8.0
Aprenda como funciona o operador de atribuição de coalescência nula (??=) do C# 8.0, com exemplos práticos como cache e atribuição condicional.
2019 / 01
- Animando fundos com Xamarin Forms
Crie um efeito de fundo animado e suave no Xamarin Forms usando animações ScaleTo em BoxViews sobrepostos.
2013 / 10
- Quanto tempo um PC leva para contar até um trillion
Benchmarking de quanto tempo um PC leva para contar até um trillion e além, com resultados atualizados de 2023.
2013 / 06
- Adicionando reconhecimento de voz ao seu app WP8
Adicione reconhecimento de voz ao seu app Windows Phone 8 usando o controle SpeechTextBox do Windows Phone toolkit.
- Atualize periodicamente suas live tiles usando ScheduledTaskAgent
Use um ScheduledTaskAgent para atualizar periodicamente as live tiles do seu Windows Phone a partir de um feed RSS.
2013 / 05
- Criando wide tiles para seu app Windows Phone 7
Crie wide live tiles para Windows Phone 7 e 8 usando a biblioteca MangoPollo com um único trecho de código.
2012 / 01
- C#: converter Hex para Color
Um extension method em C# que converte códigos de cor em hex (formatos RGB e ARGB) em objetos Color.
- Aumente sua produtividade usando code snippets
Aprenda como os code snippets do Visual Studio podem aumentar sua produtividade ao permitir inserir trechos de código reutilizáveis com um alias curto.