CA2241: Proporcionar argumentos correctos a los métodos de formato

Propiedad Value
Identificador de la regla CA2241
Título Proporcionar argumentos correctos a los métodos de formato
Categoría Uso
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

El argumento de cadena format que se pasa a un método como WriteLine, Write o System.String.Format no contiene un elemento de formato que se corresponda con cada argumento de objeto o viceversa.

De forma predeterminada, esta regla solo analiza las llamadas a los tres métodos mencionados anteriormente, pero es configurable.

Descripción de la regla

Los argumentos para métodos como WriteLine, Write y Format se componen de una cadena de formato seguida de varias instancias System.Object. La cadena de formato consta de texto y de elementos de formato incrustados del tipo {index[,alignment][:formatString]}. "index" es un entero basado en cero que indica a qué objetos se va a aplicar formato. Un objeto se ignorará si no tiene un índice correspondiente en la cadena de formato. Si el objeto que "index" especifica no existe, se produce un System.FormatException en tiempo de ejecución.

Cómo corregir infracciones

Para corregir una infracción de esta regla, proporcione un elemento de formato para cada argumento de objeto y proporcione un argumento de objeto para cada elemento de formato.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Configuración del código para analizar

Use las opciones siguientes para configurar métodos adicionales en los que se pueda ejecutar esta regla.

Métodos de formato de cadena adicionales

Puede configurar los nombres de los métodos de formato de cadena adicionales que debe analizar esta regla. Por ejemplo, para especificar todos los métodos denominados MyFormat como métodos de formato de cadena, puede agregar el siguiente par clave-valor a un archivo .editorconfig del proyecto:

dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat

Formatos de nombre de método permitidos en el valor de opción (separados por |):

  • Solo nombre de método (incluye todos los métodos con el nombre, con independencia del tipo contenedor o el espacio de nombres).
  • Nombres completos en el formato de identificador de documentación del símbolo, con un prefijo M: opcional.

Ejemplos:

Valor de la opción Resumen
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat Coincide con todos los métodos llamados MyFormat en la compilación.
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 Coincide con todos los métodos llamados MyFormat1 o MyFormat2 en la compilación.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) Coincide con un método MyFormat concreto con la signatura completa especificada.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) Coincide con los métodos MyFormat1 y MyFormat2 concretos con la signatura completa respectiva.

Determinación automática de métodos de formato de cadena adicionales

En lugar de especificar una lista explícita de métodos de formato de cadena adicionales, puede configurar el analizador para que intente determinar automáticamente el método de formato de cadena. Esta opción está deshabilitada de forma predeterminada. Si la opción está habilitada, cualquier método que tenga un parámetro string format seguido de un parámetro params object[] se considerará un método de formato de cadena:

dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true

Ejemplo

En el ejemplo siguiente se muestran dos infracciones de la regla.

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));
    }
}