CA1304: Ange CultureInfo
Property | Värde |
---|---|
Regel-ID | CA1304 |
Title | Ange CultureInfo |
Kategori | Globalisering |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En metod eller konstruktor anropar en medlem som har en överlagring som accepterar en System.Globalization.CultureInfo parameter, och metoden eller konstruktorn anropar inte den överlagring som tar parametern CultureInfo . Den här regeln ignorerar anrop till följande metoder:
Du kan också konfigurera fler symboler som ska undantas av den här regeln.
Regelbeskrivning
När ett eller System.IFormatProvider -CultureInfoobjekt inte anges kanske standardvärdet som tillhandahålls av den överbelastade medlemmen inte har den effekt som du vill ha på alla nationella inställningar. .NET-medlemmar väljer också standardkultur och formatering baserat på antaganden som kanske inte stämmer för din kod. För att säkerställa att koden fungerar som förväntat för dina scenarier bör du ange kulturspecifik information enligt följande riktlinjer:
Om värdet visas för användaren använder du den aktuella kulturen. Se CultureInfo.CurrentCulture.
Om värdet kommer att lagras och nås av programvara, d.v.s. sparas i en fil eller databas, använder du den invarianta kulturen. Se CultureInfo.InvariantCulture.
Om du inte känner till värdets mål måste datakonsumenten eller leverantören ange kulturen.
Även om standardbeteendet för den överbelastade medlemmen är lämpligt för dina behov är det bättre att uttryckligen anropa den kulturspecifika överlagringen så att koden självdokumenteras och blir enklare att underhålla.
Kommentar
CultureInfo.CurrentUICulture används endast för att hämta lokaliserade resurser med hjälp av en instans av System.Resources.ResourceManager klassen.
Så här åtgärdar du överträdelser
Om du vill åtgärda en överträdelse av den här regeln använder du den överlagring som tar ett CultureInfo argument.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln när det är säkert att standardkulturen är rätt val och där kodunderhållbarhet inte är en viktig utvecklingsprioritet.
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 CA1304
// The code that's violating the rule is on this line.
#pragma warning restore CA1304
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.CA1304.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å.
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
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
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. |
Exempel som visar hur du åtgärdar överträdelser
I följande exempel BadMethod
orsakar två överträdelser av den här regeln. GoodMethod
korrigerar den första överträdelsen genom att skicka den invarianta kulturen till String.Compareoch korrigerar den andra överträdelsen genom att skicka den aktuella kulturen till String.ToLower eftersom string3
visas för användaren.
public class CultureInfoTest
{
public void BadMethod(String string1, String string2, String string3)
{
if (string.Compare(string1, string2, false) == 0)
{
Console.WriteLine(string3.ToLower());
}
}
public void GoodMethod(String string1, String string2, String string3)
{
if (string.Compare(string1, string2, false,
CultureInfo.InvariantCulture) == 0)
{
Console.WriteLine(string3.ToLower(CultureInfo.CurrentCulture));
}
}
}
Exempel som visar formaterade utdata
I följande exempel visas effekten av den aktuella kulturen på standardvärdet IFormatProvider som väljs av DateTime typen .
public class IFormatProviderTest
{
public static void Main1304()
{
string dt = "6/4/1900 12:15:12";
// The default behavior of DateTime.Parse is to use
// the current culture.
// Violates rule: SpecifyIFormatProvider.
DateTime myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
// Change the current culture to the French culture,
// and parsing the same string yields a different value.
Thread.CurrentThread.CurrentCulture = new CultureInfo("Fr-fr", true);
myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
}
}
Det här exemplet genererar följande utdata:
6/4/1900 12:15:12 PM
06/04/1900 12:15:12