Visão geral da análise do código-fonte do .NET
Os analisadores do .NET Compiler Platform (Roslyn) inspecionam código em C# ou no Visual Basic em busca de problemas de estilo e de qualidade. A partir do .NET 5, esses analisadores estão incluídos no SDK do .NET e não é necessário instalá-los separadamente. Se o destino do projeto for o .NET 5 ou posterior, a análise de código será habilitada por padrão. Se o destino do projeto for uma implementação diferente do .NET, por exemplo, .NET Core, .NET Standard ou .NET Framework, você deverá habilitar manualmente a análise de código definindo a propriedade EnableNETAnalyzers como true
.
Se você não quiser migrar para o SDK do .NET 5+, tenha um projeto .NET Framework de estilo não SDK ou prefira um modelo baseado em pacote NuGet. Os analisadores também estarão disponíveis no pacote NuGet Microsoft.CodeAnalysis.NetAnalyzers. Talvez você prefira um modelo baseado em pacote para atualizações de versão sob demanda.
Observação
Os analisadores do .NET são independentes da estrutura de destino. Ou seja, seu projeto não precisa ser destinado a uma implementação específica do .NET. Os analisadores trabalham para projetos destinados ao .NET 5+, bem como versões anteriores do .NET, como .NET Core 3.1 e .NET Framework 4.7.2. No entanto, para habilitar a análise de código usando a propriedade EnableNETAnalyzers, seu projeto deve fazer referência a um SDK do projeto.
Se forem encontradas violações de regra por um analisador, elas serão relatadas como uma sugestão, aviso ou erro, dependendo de como cada regra foi configurada. As violações da análise de código aparecem com o prefixo "CA" ou "IDE" para diferenciá-las de erros do compilador.
Análise de qualidade de código
As regras de análise de qualidade de código ("CAxxxx") inspecionam o código em C# ou no Visual Basic para analisar a segurança, o desempenho, o design e problemas diversos. A análise está habilitada, por padrão, para projetos direcionados ao .NET 5 ou posterior. É possível habilitar a análise de código em projetos direcionados a versões anteriores do .NET definindo a propriedade EnableNETAnalyzers como true
. Também é possível desabilitar a análise de código do projeto definindo EnableNETAnalyzers
como false
.
Dica
Se você estiver usando o Visual Studio, muitas regras do analisador têm correções de código associadas que você pode aplicar para corrigir automaticamente o problema. As correções de código são mostradas no menu do ícone de lâmpada.
Regras habilitadas
As regras a seguir são habilitadas, por padrão, como erros ou avisos no .NET 9. Regras adicionais são habilitadas como sugestões.
ID do diagnóstico | Categoria | Severidade | Versão adicionada | Descrição |
---|---|---|---|---|
CA1416 | Interoperabilidade | Aviso | .NET 5 | validar a compatibilidade da plataforma |
CA1417 | Interoperabilidade | Aviso | .NET 5 | Não usar OutAttribute em parâmetros de cadeia de caracteres para P/Invokes |
CA1418 | Interoperabilidade | Aviso | .NET 6 | Usar uma cadeia de caracteres de plataforma válida |
CA1420 | Interoperabilidade | Aviso | .NET 7 | Usar recursos que exigem marshalling de runtime quando ele está desabilitado resulta em exceções no tempo de execução |
CA1422 | Interoperabilidade | Aviso | .NET 7 | validar a compatibilidade da plataforma |
CA1831 | Desempenho | Aviso | .NET 5 | Usar AsSpan em vez de indexadores baseados em intervalo na cadeia de caracteres quando apropriado |
CA1856 | Desempenho | Erro | .NET 8 | Uso incorreto do atributo ConstantExpected |
CA1857 | Desempenho | Aviso | .NET 8 | Uma constante é esperada para o parâmetro |
CA2013 | Confiabilidade | Aviso | .NET 5 | Não use ReferenceEquals com tipos de valor |
CA2014 | Confiabilidade | Aviso | .NET 5 | Não use stackalloc em loops |
CA2015 | Confiabilidade | Aviso | .NET 5 | Não definir finalizadores para tipos derivados do MemoryManager<T> |
CA2017 | Confiabilidade | Aviso | .NET 6 | Incompatibilidade de contagem de parâmetros |
CA2018 | Confiabilidade | Aviso | .NET 6 | O argumento count para Buffer.BlockCopy deve especificar o número de bytes a serem copiados |
CA2021 | Confiabilidade | Aviso | .NET 8 | Não chame Enumerable.Cast<T> ou Enumerable.OfType<T> com tipos incompatíveis |
CA2022 | Confiabilidade | Aviso | .NET 9 | Evite leituras inexatas com Stream.Read |
CA2200 | Uso | Aviso | .NET 5 | Relançar para preservar detalhes da pilha |
CA2247 | Uso | Aviso | .NET 5 | O argumento passado para o construtor TaskCompletionSource deve ser a enumeração TaskCreationOptions em vez de TaskContinuationOptions |
CA2252 | Uso | Erro | .NET 6 | Optar pela versão prévia dos recursos |
CA2255 | Uso | Aviso | .NET 6 | O atributo ModuleInitializer não deve ser usado em bibliotecas |
CA2256 | Uso | Aviso | .NET 6 | Todos os membros declarados em interfaces pai devem ter uma implementação em uma interface atribuída a DynamicInterfaceCastableImplementation |
CA2257 | Uso | Aviso | .NET 6 | Membros definidos em uma interface com o DynamicInterfaceCastableImplementationAttribute devem ser static |
CA2258 | Uso | Aviso | .NET 6 | O fornecimento de uma interface DynamicInterfaceCastableImplementation no Visual Basic não tem suporte |
CA2259 | Uso | Aviso | .NET 7 | ThreadStatic afeta apenas campos estáticos |
CA2260 | Uso | Aviso | .NET 7 | Usar o parâmetro de tipo correto |
CA2261 | Uso | Aviso | .NET 8 | Não use ConfigureAwaitOptions.SuppressThrowing com Task<TResult> |
CA2264 | Uso | Aviso | .NET 9 | Não passe um valor não anulável para ArgumentNullException.ThrowIfNull |
CA2265 | Uso | Aviso | .NET 9 | Não compare Span<T> com null ou default |
Você pode alterar a gravidade dessas regras para desabilitá-las ou elevá-las a erros. Também é possível habilitar mais regras.
- Para obter uma lista de regras incluídas em cada versão do SDK do .NET, consulte as Versões do analisador.
- Para obter uma lista de todas as regras de qualidade de código, consulte Regras de qualidade de código.
Habilitar regras adicionais
O modo de análise refere-se a uma configuração de análise de código predefinida em que nenhuma, algumas ou todas as regras estão habilitadas. No modo de análise padrão (Default
), apenas algumas regras são habilitadas como avisos de build. É possível alterar o modo de análise do projeto definindo a propriedade <AnalysisMode>
no arquivo de projeto. Os valores permitidos são:
Valor | Descrição |
---|---|
None |
Todas as regras estão desabilitadas. Você pode aderir seletivamente a regras individuais para habilitá-las. |
Default |
Modo padrão, no qual certas regras são ativadas como avisos de build, certas regras são habilitadas como sugestões do IDE do Visual Studio e as demais são desabilitadas. |
Minimum |
Modo mais agressivo do que o modo Default . Algumas sugestões altamente recomendadas para a imposição de build são habilitadas como avisos de build. Para ver quais regras isso inclui, inspecione o arquivo %ProgramFiles%/dotnet/sdk/[version]/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_[level]_minimum.globalconfig. (Para o .NET 7 e versões anteriores, a extensão de arquivo é .editorconfig.) |
Recommended |
Modo mais agressivo do que o modo Minimum , em que mais regras são habilitadas como avisos de build. Para ver quais regras estão incluídas, inspecione o arquivo %ProgramFiles%/dotnet/sdk/[version]/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_[level]_recommended.globalconfig. (Para o .NET 7 e versões anteriores, a extensão de arquivo é .editorconfig.) |
All |
Todas as regras são habilitadas como avisos de build*. Você pode recusar seletivamente regras individuais para desabilitá-las. * As regras a seguir não são habilitadas definindo AnalysisMode como All ou AnalysisLevel como latest-all : CA1017, CA1045, CA1005, CA1014, CA1060 e CA1021 e as regras do analisador de métricas de código (CA1501, CA1502, CA1505, CA1506 e CA1509). Essas regras herdadas podem ser preteridas em uma versão futura. No entanto, você ainda pode habilitá-las individualmente usando uma entrada dotnet_diagnostic.CAxxxx.severity = <severity> . |
Você também pode omitir <AnalysisMode>
em favor de um valor composto para a <AnalysisLevel>
propriedade. Por exemplo, o seguinte valor habilita o conjunto de regras recomendado para a versão mais recente: <AnalysisLevel>latest-Recommended</AnalysisLevel>
. Para obter mais informações, consulte AnalysisLevel
.
Para encontrar a gravidade padrão de cada regra disponível e se a regra está habilitada no modo de análise Default
, confira a lista completa de regras.
Tratar avisos como erros
Se você usar o sinalizador -warnaserror
ao criar seus projetos, todos os avisos de análise de código também serão tratados como erros. Se você não quiser que os avisos de qualidade de código (CAxxxx) sejam tratados como erros na presença de -warnaserror
, defina a propriedade do MSBuild CodeAnalysisTreatWarningsAsErrors
como false
no arquivo de projeto.
<PropertyGroup>
<CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>
</PropertyGroup>
Avisos de análise de código ainda serão exibidos, mas eles não interromperão o build.
Atualizações mais recentes
Por padrão, você obterá as regras de análise de código mais recentes e as severidades de regra padrão ao atualizar para versões mais recentes do SDK do .NET. Caso esse comportamento não seja desejado, por exemplo, para garantir que nenhuma nova regra seja habilitada ou desabilitada, uma substituição poderá ser feita de uma das seguintes maneiras:
Defina a propriedade do MSBuild
AnalysisLevel
como um valor específico para bloquear os avisos para esse conjunto. Ao atualizar para um SDK mais recente, você ainda receberá correções de bug para esses avisos, mas nenhum aviso novo será habilitado e nenhum aviso existente será desabilitado. Por exemplo, para bloquear o conjunto de regras para aqueles que são fornecidos com a versão 8.0 do SDK do .NET, adicione a entrada a seguir ao arquivo de projeto.<PropertyGroup> <AnalysisLevel>8.0</AnalysisLevel> </PropertyGroup>
Dica
O valor padrão da propriedade
AnalysisLevel
élatest
, o que significa que você sempre obtém as regras de análise de código mais recentes à medida que passa para versões mais recentes do SDK do .NET.Para obter mais informações e obter uma lista de valores possíveis, consulte AnalysisLevel.
Instale o pacote NuGet Microsoft.CodeAnalysis.NetAnalyzers para desvincular as atualizações de regras das atualizações do SDK do .NET. Nos projetos direcionados ao .NET 5+, a instalação do pacote desativa os analisadores internos do SDK. Um aviso de build será exibido se o SDK contiver uma versão mais recente do assembly do analisador do que a do pacote NuGet. Para desabilitar o aviso, defina a propriedade
_SkipUpgradeNetAnalyzersNuGetWarning
comotrue
.Observação
Ao instalar o pacote NuGet Microsoft.CodeAnalysis.NetAnalyzers, não adicione a propriedade EnableNETAnalyzers ao arquivo de projeto ou a um arquivo Directory.Build.props. Quando o pacote NuGet é instalado e a propriedade
EnableNETAnalyzers
é definida comotrue
, um aviso de build é gerado.
Análise de estilo de código
As regras de análise de estilo de código ("IDExxxx") permitem que você defina e mantenha o estilo de código consistente em sua base de código. As configurações de habilitação padrão são:
Build de linha de comando: a análise de estilo de código está desabilitada, por padrão, para todos os projetos .NET em builds de linha de comando.
Você pode habilitar a análise de estilo de código no build, tanto na linha de comando quanto dentro do Visual Studio. As violações de estilo de código aparecem como avisos ou erros com o prefixo "IDE". Isso permite que você imponha estilos de código consistentes no tempo de build.
Visual Studio: a análise de estilo de código está habilitada, por padrão, para todos os projetos .NET dentro do Visual Studio como ações rápidas de refatoração de código.
Para obter uma lista completa de regras de análise de estilo de código, consulte Regras de estilo de código.
Habilitar no build
Você pode habilitar a análise de estilo de código ao criar na linha de comando e no Visual Studio. (No entanto, por motivos de desempenho, algumas regras de estilo de código ainda serão aplicadas somente no IDE do Visual Studio.)
Siga estas etapas para habilitar a análise de estilo de código no build:
Defina a propriedade do MSBuild EnforceCodeStyleInBuild como
true
.Em um arquivo .editorconfig, configure cada regra de estilo de código "IDE" que você deseja executar no build como um aviso ou erro. Por exemplo:
[*.{cs,vb}] # IDE0040: Accessibility modifiers required (escalated to a build warning) dotnet_diagnostic.IDE0040.severity = warning
Dica
A partir do .NET 9, você também pode usar o formato de opção para especificar um nível de gravidade e isso será considerado no momento da compilação. Por exemplo:
[*.{cs,vb}] # IDE0040: Accessibility modifiers required (escalated to a build warning) dotnet_style_require_accessibility_modifiers = always:warning
Como alternativa, é possível configurar uma categoria inteira para ser um aviso ou erro, por padrão, e desativar seletivamente as regras nessa categoria que não deseja executar no build. Por exemplo:
[*.{cs,vb}] # Default severity for analyzer diagnostics with category 'Style' (escalated to build warnings) dotnet_analyzer_diagnostic.category-Style.severity = warning # IDE0040: Accessibility modifiers required (disabled on build) dotnet_diagnostic.IDE0040.severity = silent
Suprimir um aviso
Uma maneira de suprimir uma violação de regra é definindo a opção de severidade para essa ID de regra como none
em um arquivo EditorConfig. Por exemplo:
dotnet_diagnostic.CA1822.severity = none
Para obter mais informações e outras maneiras de suprimir avisos, consulte Como suprimir os avisos da análise de código.
Analisadores de terceiros
Além dos analisadores oficiais do .NET, também é possível instalar analisadores de terceiros, como StyleCop, Roslynator, XUnit Analyzers e Sonar Analyzer.