CA1512: Usar o auxiliar de geração de ArgumentOutOfRangeException

Propriedade Valor
ID da regra CA1512
Título Usar o auxiliar de geração de ArgumentOutOfRangeException
Categoria Facilidade de manutenção
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

O código verifica se um argumento é menor ou maior que determinado valor e gera uma ArgumentOutOfRangeException condicionalmente.

Descrição da regra

As verificações de argumento têm um impacto substancial no tamanho do código e costumam dominar o código quanto a funções pequenas e setters de propriedade. Essas verificações evitam o inlining e causam poluição substancial no cache de instruções. Métodos auxiliares de geração, como ArgumentOutOfRangeException.ThrowIfGreaterThan, são mais simples e eficientes do que blocos if que constroem uma nova instância de exceção.

Exemplo

O seguinte snippet de código mostra violações da CA1512:

void M(int arg)
{
    if (arg is 0)
        throw new ArgumentOutOfRangeException(nameof(arg));
    if (arg < 0)
        throw new ArgumentOutOfRangeException(nameof(arg));
    if (arg <= 0)
        throw new ArgumentOutOfRangeException(nameof(arg));
    if (arg <= 42)
        throw new ArgumentOutOfRangeException(nameof(arg));
    if (arg < 42)
        throw new ArgumentOutOfRangeException(nameof(arg));
    if (arg > 42)
        throw new ArgumentOutOfRangeException(nameof(arg));
    if (arg >= 42)
        throw new ArgumentOutOfRangeException(nameof(arg));
    if (arg == 42)
        throw new ArgumentOutOfRangeException(nameof(arg));
    if (arg != 42)
        throw new ArgumentOutOfRangeException(nameof(arg));
}

O seguinte snippet de código mostra as correções:

void M(int arg)
{
    ArgumentOutOfRangeException.ThrowIfZero(arg);
    ArgumentOutOfRangeException.ThrowIfNegative(arg);
    ArgumentOutOfRangeException.ThrowIfNegativeOrZero(arg);
    ArgumentOutOfRangeException.ThrowIfLessThanOrEqual(arg, 42);
    ArgumentOutOfRangeException.ThrowIfLessThan(arg, 42);
    ArgumentOutOfRangeException.ThrowIfGreaterThan(arg, 42);
    ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(arg, 42);
    ArgumentOutOfRangeException.ThrowIfEqual(arg, 42);
    ArgumentOutOfRangeException.ThrowIfNotEqual(arg, 42);
}

Como corrigir violações

Substitua o bloco if que gera a exceção por uma chamada a um dos seguintes métodos de auxiliar de geração:

Ou, no Visual Studio, use o menu de lâmpada para corrigir o código automaticamente.

Quando suprimir avisos

Será seguro suprimir uma violação dessa regra se você não estiver preocupado com a manutenção do código. Também não há problema em suprimir violações identificadas como falsos positivos.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

#pragma warning disable CA1512
// The code that's violating the rule is on this line.
#pragma warning restore CA1512

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA1512.severity = none

Para obter mais informações, confira Como suprimir avisos de análise de código.