Share via


CA2241: Fornecer argumentos corretos para métodos de formatação

Property Valor
ID da regra CA2241
Título Fornecer argumentos corretos para métodos de formatação
Categoria Usage
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

O argumento de cadeia de caracteres format foi transmitido para um método como WriteLine, Write ou System.String.Format não contém um item de formato que corresponda a cada argumento do objeto ou vice-versa.

Por padrão, essa regra só analisa as chamadas aos três métodos mencionados anteriormente, mas isso é configurável.

Descrição da regra

Os argumentos para métodos como WriteLine, Write e Format consistem em uma cadeia de caracteres de formato seguida de várias instâncias de System.Object. A cadeia de caracteres de formato consiste em itens de texto e formato inserido do formato {index[,alignment][:formatString]}. 'index' é um inteiro baseado em zero que indica qual dos objetos será formatado. Se um objeto não tiver um índice correspondente na cadeia de caracteres de formato, o objeto será ignorado. Se o objeto especificado por 'index' não existir, uma System.FormatException será gerada em tempo de execução.

Como corrigir violações

Para corrigir uma violação dessa regra, forneça um item de formato para cada argumento de objeto e forneça um argumento de objeto para cada item de formato.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Configurar código para analisar

Use as opções a seguir para configurar métodos adicionais nos quais essa regra será executada.

Métodos de formatação de cadeia de caracteres adicionais

Você pode configurar nomes de métodos de formatação de cadeia de caracteres adicionais que devem ser analisados por essa regra. Por exemplo, para especificar todos os métodos chamados MyFormat como métodos de formatação de cadeia de caracteres, adicione o seguinte par chave-valor a um arquivo .editorconfig no projeto:

dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat

Formatos de nome de método permitidos no valor da opção (separados por |):

  • Somente o nome do método (inclui todos os métodos com o nome, independentemente do tipo ou do namespace que contém)
  • Nomes totalmente qualificados no formato de ID de documentação do símbolo, com um prefixo opcional M:.

Exemplos:

Valor de Opção Resumo
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat Corresponde a todos os métodos chamados MyFormat na compilação.
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 Corresponde a todos os métodos chamados MyFormat1 ou MyFormat2 na compilação.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) Corresponde ao método MyFormat específico com uma assinatura totalmente qualificada especificada.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) Corresponde aos métodos MyFormat1 e MyFormat2 específicos com as respectivas assinaturas totalmente qualificadas.

Determinar métodos de formatação de cadeia de caracteres adicionais automaticamente

Em vez de especificar uma lista explícita de métodos de formatação de cadeia de caracteres adicionais, você pode configurar o analisador para tentar determinar automaticamente o método de formatação de cadeia de caracteres. Por padrão, essa opção está desabilitada. Se a opção estiver habilitada, qualquer método que tenha um parâmetro string format seguido de um parâmetro params object[] será considerado um método de formatação de cadeia de caracteres:

dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true

Exemplo

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

Imports System

Namespace ca2241

    Class CallsStringFormat

        Sub CallFormat()

            Dim file As String = "file name"
            Dim errors As Integer = 13

            ' Violates the rule.
            Console.WriteLine(String.Format("{0}", file, errors))

            Console.WriteLine(String.Format("{0}: {1}", file, errors))

            ' Violates the rule and generates a FormatException at runtime.
            Console.WriteLine(String.Format("{0}: {1}, {2}", file, errors))

        End Sub

    End Class

End Namespace
class CallsStringFormat
{
    void CallFormat()
    {
        string file = "file name";
        int errors = 13;

        // Violates the rule.
        Console.WriteLine(string.Format("{0}", file, errors));

        Console.WriteLine(string.Format("{0}: {1}", file, errors));

        // Violates the rule and generates a FormatException at runtime.
        Console.WriteLine(string.Format("{0}: {1}, {2}", file, errors));
    }
}