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
- Determinar automáticamente métodos de formato de cadena adicionales
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));
}
}