我的代码从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
,因此从资源表中提取字符串 。
我不想静态设置表单的标题,因为(特别是在alpha和beta阶段)我希望它具有动态版本号。
答案 0 :(得分:7)
基于CA1303的documentation,引发警告的原因是您将文字字符串作为String.Format
方法的第二个参数传递,另外还有第二个形式参数特殊重载使用LocalizableAttribute
进行注释。
因此,警告您要做的是将字符串"{0} v{1}.{2} Alpha r{3}"
作为资源程序集中的本地化资源,并将其作为参考。这可能是一个好主意,因为从技术上讲,格式字符串的结构及其内容的固定部分是可本地化的资源。
如果您只是想让FxCop闭嘴,您可以相应地annotate UpdateTitle
:
[SuppressMessage("Microsoft.Globalization",
"CA1303:DoNotPassLiteralsAsLocalizedParameters" )]
private void UpdateTitle() { /* ... */ }
答案 1 :(得分:0)
忽略此警告的一般方法是将以下内容添加到您的.csproj
文件中:
<NoWarn>CA1303</NoWarn>