CA1303: Nepředávejte literály jako lokalizované parametry
Vlastnost | Hodnota |
---|---|
ID pravidla | CA1303 |
Název | Nepředávejte literály jako lokalizované parametry |
Kategorie | Globalizace |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | No |
Příčina
Metoda předá řetězcový literál jako parametr konstruktoru nebo metodě .NET a tento řetězec by měl být lokalizovatelný.
Toto upozornění se vyvolá, když se literálový řetězec předá jako hodnota parametru nebo vlastnosti a jedna nebo více následujících situací je pravdivá:
Atribut LocalizableAttribute parametru nebo vlastnosti je nastaven na
true
.Literálový řetězec se předá
string value
nebostring format
parametr Console.Write přetížení metody.Console.WriteLinePravidlo CA1303 je nakonfigurováno tak, aby používalo heuristické pojmenování a název parametru nebo vlastnosti obsahuje frázi
Text
,Message
neboCaption
.
Ve výchozím nastavení toto pravidlo analyzuje celý základ kódu, ale dá se nakonfigurovat.
Popis pravidla
Řetězcové literály vložené do zdrojového kódu se obtížně lokalizují.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, nahraďte řetězcový literál řetězcem načteným prostřednictvím instance ResourceManager třídy.
U metod, které nevyžadují lokalizované řetězce, můžete eliminovat zbytečná upozornění CA1303 následujícími způsoby:
- Pokud je povolená heuristická možnost pojmenování, přejmenujte parametr nebo vlastnost.
- LocalizableAttribute Odeberte atribut u parametru nebo vlastnosti nebo ho nastavte na
false
([Localizable(false)]
).
Kdy potlačit upozornění
Pokud platí některý z následujících příkazů, je bezpečné potlačit upozornění z tohoto pravidla:
- Knihovna kódu nebude lokalizována.
- Řetězec není vystavený koncovému uživateli nebo vývojáři pomocí knihovny kódu.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA1303
// The code that's violating the rule is on this line.
#pragma warning restore CA1303
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA1303.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Konfigurace kódu pro analýzu
Pomocí následujících možností můžete nakonfigurovat, pro které části základu kódu se má toto pravidlo spouštět.
- Vyloučení konkrétních symbolů
- Vyloučení konkrétních typů a jejich odvozených typů
- Použití heuristického pojmenování
Tyto možnosti můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (globalizace), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.
Vyloučení konkrétních symbolů
Z analýzy můžete vyloučit konkrétní symboly, jako jsou typy a metody. Pokud chcete například určit, že pravidlo by se nemělo spouštět u žádného kódu v rámci pojmenovaných MyType
typů, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Povolené formáty názvů symbolů v hodnotě možnosti (oddělené ):|
- Pouze název symbolu (zahrnuje všechny symboly s názvem bez ohledu na typ nebo obor názvů).
- Plně kvalifikované názvy ve formátu ID dokumentace symbolu. Každý název symbolu vyžaduje předponu typu symbolu, například
M:
pro metody,T:
typy aN:
obory názvů. .ctor
pro konstruktory a.cctor
statické konstruktory.
Příklady:
Hodnota možnosti | Shrnutí |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Odpovídá všem symbolům s názvem MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Porovná všechny symboly pojmenované buď MyType1 nebo MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Odpovídá konkrétní metodě MyMethod se zadaným plně kvalifikovaným podpisem. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Odpovídá konkrétním metodám MyMethod1 a MyMethod2 příslušným plně kvalifikovaným podpisům. |
Vyloučení konkrétních typů a jejich odvozených typů
Z analýzy můžete vyloučit konkrétní typy a jejich odvozené typy. Pokud chcete například určit, že pravidlo by se nemělo spouštět u žádné metody v rámci pojmenovaných MyType
typů a jejich odvozených typů, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Povolené formáty názvů symbolů v hodnotě možnosti (oddělené ):|
- Pouze název typu (zahrnuje všechny typy s názvem bez ohledu na typ nebo obor názvů).
- Plně kvalifikované názvy ve formátu ID dokumentace symbolu s volitelnou
T:
předponou.
Příklady:
Hodnota možnosti | Shrnutí |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Odpovídá všem pojmenovaným MyType typům a všem jejich odvozeným typům. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Odpovídá všem typům pojmenovaným buď MyType1 nebo MyType2 a všem jejich odvozeným typům. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Odpovídá určitému typu MyType s daným plně kvalifikovaným názvem a všemi jeho odvozenými typy. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Odpovídá konkrétním typům MyType1 a MyType2 příslušným plně kvalifikovaným názvům a všem jejich odvozeným typům. |
Použití heuristického pojmenování
Můžete nakonfigurovat, zda parametry nebo názvy vlastností obsahují Text
, Message
nebo Caption
aktivuje toto pravidlo.
dotnet_code_quality.CA1303.use_naming_heuristic = true
Příklad
Následující příklad ukazuje metodu, která zapisuje do konzoly, když některý z jejích dvou argumentů je mimo rozsah. Pro kontrolu argumentu hour
se předá Console.WriteLine
řetězec literálu, který porušuje toto pravidlo. Pro kontrolu argumentu minute
se předá Console.WriteLine
řetězec načtený prostřednictvím operátoru ResourceManager , který splňuje pravidlo.
<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));
}
}
}