Compartilhar via


CA1863: Usar 'CompositeFormat'

Propriedade Valor
ID da regra CA1863
Título Use CompositeFormat.
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

Chamadas de código String.Format(String, Object[]) ou StringBuilder.AppendFormat(String, Object[]) com uma static cadeia de caracteres de formato que não foi armazenada em cache em uma instância CompositeFormat.

Descrição da regra

É caro analisar uma cadeia de caracteres de formato em tempo de execução. Essa regra localiza locais em seu código em que você pode armazenar em cache e usar uma instância CompositeFormat como argumento para uma operação de formatação, em vez de passar a cadeia de caracteres de formato original. Uma instância CompositeFormat analisa a cadeia de caracteres de formato composto quando é criada, o que significa que o "caminho crítico" da formatação de cadeia de caracteres pode ser executado muito mais rapidamente.

Como corrigir violações

Crie uma instância de CompositeFormat chamando CompositeFormat.Parse(String) e passe-a para String.Format(IFormatProvider, CompositeFormat, Object[]) ou StringBuilder.AppendFormat(IFormatProvider, CompositeFormat, Object[]) em vez da cadeia de caracteres de formato original.

Exemplo

O exemplo a seguir mostra duas violações da regra:

class C
{
    private static readonly string StaticField = "Format one value: {0}";

    static void Main()
    {
        _ = string.Format(StaticField, 42);

        StringBuilder sb = new();
        sb.AppendFormat(StaticField, 42);
    }
}

O exemplo a seguir mostra o código que corrige ambas as violações:

class C
{
    private static readonly CompositeFormat StaticField = CompositeFormat.Parse("Format one value: {0}");

    static void Main()
    {
        _ = string.Format(null, StaticField, 42);

        StringBuilder sb = new();
        sb.AppendFormat(null, StaticField, 42);
    }
}

Quando suprimir avisos

É seguro suprimir um diagnóstico dessa regra se o desempenho não é uma preocupação.

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 CA1863
// The code that's violating the rule is on this line.
#pragma warning restore CA1863

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.CA1863.severity = none

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