CA1303: не следует передавать литералы в виде локализованных параметров
Свойство | Значение |
---|---|
Идентификатор правила | CA1303 |
Заголовок | Не передавайте литералы в качестве локализованных параметров |
Категория | Глобализация |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Метод передает строковый литерал в виде параметра конструктору .NET или методу, и эта строка должна быть локализуемой.
Это предупреждение возникает, когда литеральная строка передается в качестве значения параметру или свойству, а также в следующих ситуациях:
Атрибут LocalizableAttribute параметра или свойства имеет значение
true
.Литеральная строка передается параметру
string value
илиstring format
перегрузки метода Console.Write или Console.WriteLine.Правило CA1303 настроено для использования эвристики именования, а имя параметра или свойства содержит фразу
Text
,Message
илиCaption
.
По умолчанию это правило анализирует всю базу кода, но такое поведение можно настроить.
Описание правила
Строковые литералы, внедренные в исходный код, трудно локализовать.
Устранение нарушений
Чтобы устранить нарушение этого правила, замените строковый литерал строкой, полученной с помощью экземпляра класса ResourceManager.
Для методов, которым не требуются локализованные строки, можно исключить ненужные предупреждения CA1303 следующими способами.
- Если параметр эвристики именования включен, переименуйте параметр или свойство.
- Удалите атрибут LocalizableAttribute для параметра или свойства или задайте для него значение
false
([Localizable(false)]
).
Когда лучше отключить предупреждения
Вывод предупреждения для этого правила можно отключить при выполнении одного из следующих условий.
- Библиотека кода не будет локализована.
- Строка не предоставляется конечному пользователю или разработчику с помощью библиотеки кода.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1303
// The code that's violating the rule is on this line.
#pragma warning restore CA1303
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1303.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующие параметры, чтобы указать части базы кода, к которым будет применяться это правило.
- Исключить определенные символы
- Исключить определенные типы и их производные типы
- Использовать эвристику именования
Эти параметры можно настроить только для этого правила, для всех правил, к которым она применяется, или для всех правил в этой категории (глобализация), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Исключение определенных символов
Вы можете исключить из анализа определенные символы, например типы и методы. Например, чтобы указать, что правило не должно выполняться для какого-либо кода в типах с именем MyType
, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Заметка
Замените XXXX
частью CAXXXX
идентификатором применимого правила.
Допустимые форматы имени символа в значении параметра (разделенные |
):
- Только имя символа (включает все символы с этим именем, любого типа и в любом пространстве имен).
- Полные имена в формате идентификатора документации для символа. Для каждого имени символа требуется префикс в виде символа, например
M:
для методов,T:
для типов иN:
для пространств имен. -
.ctor
используется для конструкторов, а.cctor
— для статических конструкторов.
Примеры:
Значение параметра | Итоги |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Соответствует всем символам с именем MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Соответствует всем символам с именем MyType1 или MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Соответствует конкретному методу MyMethod с заданной полной сигнатурой. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Соответствует конкретным методам MyMethod1 и MyMethod2 с соответствующими полными сигнатурами. |
Исключить определенные типы и их производные типы
Из анализа можно исключать определенные типы и их производные типы. Например, чтобы указать, что правило не должно выполняться в каких-либо методах типов MyType
и их производных типов, добавьте следующую пару "ключ-значение" в файл .editorconfig своего проекта:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Заметка
Замените XXXX
частью CAXXXX
идентификатором применимого правила.
Допустимые форматы имени символа в значении параметра (разделенные |
):
- Только имя типа (включает все типы с этим именем, любого типа и в любом пространстве имен).
- полные имена в формате идентификатора документации для символа с необязательным префиксом
T:
.
Примеры:
Значение параметра | Итоги |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Соответствует всем типам с именем MyType и всем их производным типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Соответствует всем типам с именем MyType1 или MyType2 и всем их производным типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Соответствует конкретному типу MyType с заданным полным именем и всем производным от него типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Соответствует конкретным типам MyType1 и MyType2 с заданным полным именем и всем производным от них типам. |
Использование эвристики именования
Можно указать, будет ли это правило активироваться параметрами или именами свойств, содержащими Text
, Message
или Caption
.
dotnet_code_quality.CA1303.use_naming_heuristic = true
Пример
В следующем примере показан метод, который выполняет запись в консоль, когда один из двух его аргументов выходит за пределы диапазона. Для проверки аргумента hour
литеральная строка передается Console.WriteLine
, что приводит к нарушению правила. Для проверки аргумента minute
строка, полученная с помощью ResourceManager, передается Console.WriteLine
, что соответствует правилу.
<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));
}
}
}