CA1303, DoNotPassLiteralsAsLocalizedParameters, но я на самом деле нет


Мой код получает предупреждение CA1303 от Microsoft.Globalization, "не передавайте литералы как локализованные параметры", , но мой код на самом деле не передает литерал :

private void MyForm_Load(object sender, EventArgs e)
{
    UpdateTitle();
}

private void UpdateTitle()
{
    Version version = Assembly.GetExecutingAssembly().GetName().Version;
    CultureInfo culture = CultureInfo.CurrentUICulture;
    this.Text = String.Format(culture, "{0} v{1}.{2} Alpha r{3}", this.Text, version.Major, version.Minor, version.Build);
}

Этот код задает заголовок формы примерно так, каждый раз, когда она загружается:

MyFormNameAsSetInTheDesigner версии v0.1 Альфа-r123

(version.build На самом деле содержит ревизию SVN, которая автоматически обновляется при каждой фиксации, я не использую revision, потому что моя схема управления версиями использует только 3 числа, major.minor.revision)

но это вызывает вышеупомянутое предупреждение , потому что он думает, что я устанавливаю текст заголовка из строкового литерала. Фактически, я установил Localizable = True в конструкторе, так что строка извлекается из таблицы ресурсов.

Я не хочу устанавливать название формы статически, потому что (особенно на альфа-и бета-стадиях) я хочу, чтобы у нее были динамические номера версий.

Вопрос в том, что я делаю, чтобы не получить предупреждение (например, какой код будет делать то, что я делаю, но будет считаться правильным для FxCop, или как я могу подавить его для этой строки).

1 5

1 ответ:

Основываясь на документации для CA1303, причина появления предупреждения заключается в том, что вы передаете литеральную строку в качестве второго параметра метода String.Format, и вдобавок второй формальный параметр этой конкретной перегрузки аннотируется LocalizableAttribute.

Поэтому предупреждение требует, чтобы вы поместили строку "{0} v{1}.{2} Alpha r{3}" в качестве локализованного ресурса в сборку ресурсов и ссылались на нее как на таковую. Что, вероятно, хорошая идея, так как технически структура строка форматирования и фиксированные части ее содержимого являются локализуемыми ресурсами.

Если вы просто хотите заставить FxCop заткнуться, вы можете аннотировать UpdateTitle соответственно:

[SuppressMessage("Microsoft.Globalization",
                 "CA1303:DoNotPassLiteralsAsLocalizedParameters" )]
private void UpdateTitle() { /* ... */ }