CA1303: Skicka inte literaler som lokaliserade parametrar
Property | Värde |
---|---|
Regel-ID | CA1303 |
Title | Skicka inte literaler som lokaliserade parametrar |
Kategori | Globalisering |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En metod skickar en strängliteral som en parameter till en .NET-konstruktor eller -metod och strängen ska vara localizable.
Den här varningen utlöses när en literalsträng skickas som ett värde till en parameter eller egenskap och en eller flera av följande situationer stämmer:
Attributet LocalizableAttribute för parametern eller egenskapen är inställt på
true
.Literalsträngen skickas till parametern
string value
ellerstring format
för en Console.Write eller Console.WriteLine -metodöverlagring.Regel CA1303 är konfigurerad för att använda namngivnings-heuristiken, och en parameter eller egenskapsnamn innehåller frasen
Text
,Message
ellerCaption
.
Som standard analyserar den här regeln hela kodbasen, men detta kan konfigureras.
Regelbeskrivning
Strängliteraler som är inbäddade i källkod är svåra att lokalisera.
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln ersätter du strängliteralen med en sträng som hämtats via en instans av ResourceManager klassen.
För metoder som inte kräver lokaliserade strängar kan du eliminera onödiga CA1303-varningar på följande sätt:
- Om det heuristiska alternativet namngivning är aktiverat byter du namn på parametern eller egenskapen.
-
LocalizableAttribute Ta bort attributet för parametern eller egenskapen eller ange det till
false
([Localizable(false)]
).
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln om någon av följande instruktioner gäller:
- Kodbiblioteket kommer inte att lokaliseras.
- Strängen exponeras inte för slutanvändaren eller en utvecklare som använder kodbiblioteket.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1303
// The code that's violating the rule is on this line.
#pragma warning restore CA1303
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1303.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
- Exkludera specifika symboler
- Exkludera specifika typer och deras härledda typer
- Använda heuristisk namngivning
Du kan konfigurera dessa alternativ för just den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (globalisering) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Exkludera specifika symboler
Du kan exkludera specifika symboler, till exempel typer och metoder, från analys. Om du till exempel vill ange att regeln inte ska köras på någon kod inom typer med namnet MyType
lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Not
Ersätt den XXXX
delen av CAXXXX
med ID:t för den tillämpliga regeln.
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Endast symbolnamn (innehåller alla symboler med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format. Varje symbolnamn kräver ett symboltypprefix, till exempel
M:
för metoder,T:
för typer ochN:
för namnområden. -
.ctor
för konstruktorer och.cctor
statiska konstruktorer.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Matchar alla symboler med namnet MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Matchar alla symboler med namnet antingen MyType1 eller MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Matchar en specifik metod MyMethod med den angivna fullständigt kvalificerade signaturen. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Matchar specifika metoder MyMethod1 och MyMethod2 med respektive fullständigt kvalificerade signaturer. |
Exkludera specifika typer och deras härledda typer
Du kan exkludera specifika typer och deras härledda typer från analys. Om du till exempel vill ange att regeln inte ska köras på några metoder inom typer som heter MyType
och deras härledda typer lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Not
Ersätt den XXXX
delen av CAXXXX
med ID:t för den tillämpliga regeln.
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Skriv endast namn (innehåller alla typer med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format, med ett valfritt
T:
prefix.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Matchar alla typer med namnet MyType och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Matchar alla typer med namnet antingen MyType1 eller MyType2 och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Matchar en specifik typ MyType med ett angivet fullständigt kvalificerat namn och alla dess härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Matchar specifika typer MyType1 och MyType2 med respektive fullständigt kvalificerade namn och alla deras härledda typer. |
Använda heuristisk namngivning
Du kan konfigurera om parametrar eller egenskapsnamn som innehåller Text
, Message
eller Caption
utlöser den här regeln.
dotnet_code_quality.CA1303.use_naming_heuristic = true
Exempel
I följande exempel visas en metod som skriver till konsolen när något av dess två argument ligger utom räckhåll.
hour
För argumentkontrollen skickas en literalsträng till Console.WriteLine
, vilket bryter mot den här regeln.
minute
För argumentkontrollen skickas en sträng som hämtas via en ResourceManager till Console.WriteLine
, som uppfyller regeln.
<Assembly: System.Resources.NeutralResourcesLanguageAttribute("en-US")>
Namespace GlobalizationLibrary
Public Class DoNotPassLiterals
Dim stringManager As System.Resources.ResourceManager
Sub New()
stringManager = New System.Resources.ResourceManager(
"en-US", System.Reflection.Assembly.GetExecutingAssembly())
End Sub
Sub TimeMethod(hour As Integer, minute As Integer)
If (hour < 0 Or hour > 23) Then
'CA1303 fires because a literal string
'is passed as the 'value' parameter.
Console.WriteLine("The valid range is 0 - 23.")
End If
If (minute < 0 Or minute > 59) Then
Console.WriteLine(
stringManager.GetString("minuteOutOfRangeMessage",
System.Globalization.CultureInfo.CurrentUICulture))
End If
End Sub
End Class
End Namespace
public class DoNotPassLiterals
{
ResourceManager stringManager;
public DoNotPassLiterals()
{
stringManager = new ResourceManager("en-US", Assembly.GetExecutingAssembly());
}
public void TimeMethod(int hour, int minute)
{
if (hour < 0 || hour > 23)
{
// CA1303 fires because a literal string
// is passed as the 'value' parameter.
Console.WriteLine("The valid range is 0 - 23.");
}
if (minute < 0 || minute > 59)
{
Console.WriteLine(stringManager.GetString(
"minuteOutOfRangeMessage", CultureInfo.CurrentUICulture));
}
}
}