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 ответ:
Основываясь на документации для CA1303, причина появления предупреждения заключается в том, что вы передаете литеральную строку в качестве второго параметра метода
Поэтому предупреждение требует, чтобы вы поместили строкуString.Format
, и вдобавок второй формальный параметр этой конкретной перегрузки аннотируетсяLocalizableAttribute
."{0} v{1}.{2} Alpha r{3}"
в качестве локализованного ресурса в сборку ресурсов и ссылались на нее как на таковую. Что, вероятно, хорошая идея, так как технически структура строка форматирования и фиксированные части ее содержимого являются локализуемыми ресурсами.Если вы просто хотите заставить FxCop заткнуться, вы можете аннотировать
UpdateTitle
соответственно:[SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters" )] private void UpdateTitle() { /* ... */ }