CA1303,DoNotPassLiteralsAsLocalizedParameters,但实际上并非如此

Cam*_*tin 8 .net fxcop localization visual-studio-2010 winforms

我的代码获取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);
}
Run Code Online (Sandbox Code Playgroud)

每次加载时,此代码都会将表单的标题设置为类似的内容:

MyFormNameAsSetInTheDesigner v0.1 Alpha r123

(version.build实际上包含SVN修订版,在每次提交时自动更新,我不使用,revision因为我的版本控制方案只使用3个数字,major.minor.revision)

但这会触发上述警告,因为它认为我是从字符串文字设置标题栏文本.实际上,我已经Localizable = True在设计器中进行了设置,以便从资源表中获取字符串.

我不想静态设置表单的标题,因为(特别是在alpha和beta阶段)我希望它具有动态版本号.

问题是我该怎么办,所以我没有得到警告(例如,哪些代码会执行我正在做的事情,但根据FxCop被认为是正确的,或者我怎么能为该行压制它).

Jon*_*Jon 11

根据CA1303 的文档,引发警告的原因是您将文字字符串作为方法的第二个参数传递String.Format,此外,该特定重载的第二个形式参数也使用注释LocalizableAttribute.

因此,警告您要做的是将字符串"{0} v{1}.{2} Alpha r{3}"作为资源程序集中的本地化资源,并将其作为参考.这可能是一个好主意,因为从技术上讲,格式字符串的结构及其内容的固定部分是本地化的资源.

如果您只是想让FxCop闭嘴,您可以相应地进行注释 UpdateTitle:

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