CA1303, DoNotPassLiteralsAsLocalizedParameters, но на самом деле я не - PullRequest
6 голосов
/ 21 марта 2012

Мой код получает предупреждение 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 Alpha r123

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

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

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

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

1 Ответ

8 голосов
/ 21 марта 2012

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

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

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

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