CA2241: Ange rätt argument för formateringsmetoder
Property | Värde |
---|---|
Regel-ID | CA2241 |
Title | Ange rätt argument för formateringsmetoder |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
Strängargumentet format
som skickas till en metod som WriteLine, Writeeller System.String.Format innehåller inte ett formatobjekt som motsvarar varje objektargument eller vice versa.
Som standard analyserar den här regeln endast anrop till de tre metoder som nämnts tidigare, men detta kan konfigureras.
Regelbeskrivning
Argumenten till metoder som WriteLine, Writeoch Format består av en formatsträng följt av flera System.Object instanser. Formatsträngen består av text och inbäddade formatobjekt i formuläret {index[,alignment][:formatString]}
. "index" är ett nollbaserat heltal som anger vilket av objekten som ska formateras. Om ett objekt inte har något motsvarande index i formatsträngen ignoreras objektet. Om objektet som anges av "index" inte finns genereras ett System.FormatException vid körning.
Så här åtgärdar du överträdelser
Om du vill åtgärda en överträdelse av den här regeln anger du ett formatobjekt för varje objektargument och anger ett objektargument för varje formatobjekt.
När du ska ignorera varningar
Ignorera inte en varning från den här regeln.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera ytterligare metoder för att köra den här regeln på.
Ytterligare strängformateringsmetoder
Du kan konfigurera namn på ytterligare strängformateringsmetoder som ska analyseras av den här regeln. Om du till exempel vill ange alla metoder med namnet MyFormat
som strängformateringsmetoder kan du lägga till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat
Tillåtna metodnamnformat i alternativvärdet (avgränsade med |
):
- Endast metodnamn (innehåller alla metoder med namnet, oavsett vilken typ eller namnrymd som finns)
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format, med ett valfritt
M:
prefix.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat |
Matchar alla metoder med namnet MyFormat i kompilering. |
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 |
Matchar alla metoder med namnet antingen MyFormat1 eller MyFormat2 i kompilering. |
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) |
Matchar en specifik metod MyFormat med en given fullständigt kvalificerad signatur. |
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) |
Matchar specifika metoder MyFormat1 och MyFormat2 med respektive fullständigt kvalificerade signatur. |
Fastställa ytterligare strängformateringsmetoder automatiskt
I stället för att ange en explicit lista över ytterligare strängformateringsmetoder kan du konfigurera analysatorn så att den automatiskt försöker fastställa strängformateringsmetoden. Det här alternativet är inaktiverat som standard. Om alternativet är aktiverat betraktas alla metoder som har en string format
parameter följt av en params object[]
parameter som en strängformateringsmetod:
dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true
Exempel
I följande exempel visas två överträdelser av regeln.
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));
}
}