C# CA1305:指定区域性时的详细性

C# CA1305:指定区域性时的详细性,c#,.net,localization,code-analysis,C#,.net,Localization,Code Analysis,当存在需要IFormatProvider但代码中未使用此重载的重载时引发 例如,以下代码会引发此警告: string.Format("{0} - {1}", id, name); 消除此警告的明显方法是指定要使用的区域性: string.Format(CultureInfo.InvariantCulture, "{0} - {1}", id, name); 然而,我认为这太冗长了 存在哪些替代方案?在保留显式格式提供程序传递的同时,几乎唯一可以减少详细性的替代方案是使用特定于区域性的外观方法

当存在需要
IFormatProvider
但代码中未使用此重载的重载时引发

例如,以下代码会引发此警告:

string.Format("{0} - {1}", id, name);
消除此警告的明显方法是指定要使用的区域性:

string.Format(CultureInfo.InvariantCulture, "{0} - {1}", id, name);
然而,我认为这太冗长了


存在哪些替代方案?

在保留显式格式提供程序传递的同时,几乎唯一可以减少详细性的替代方案是使用特定于区域性的外观方法。幸运的是,对于不变量文化和CurrentCulture,通常只需要一种格式,因此每个底层格式方法只需要两种façade方法

示例代码的典型façade方法可能具有如下签名:

public static string FormatForInvariantCulture(this string template, params object[] substitutions)
其名称如下:

"{0} - {1}".FormatForInvariantCulture(id, name);
组织façade方法的另一种方法是将其转换为特定于文化的格式化程序类型,这些格式化程序类型可以使用IoC技术注入。例如,可以为格式化定义如下接口:

public interface IFormatter
{
    string Format(string template, params object[] substitutions);
}
然后,可以将特定于区域性的实例注入到需要使用以下构造函数执行格式设置的类型中:

public SomeClass(IFormatter systemFormatter, IFormatter uiFormatter)
{
    // ...
}

不管封装方法的方式是什么,重要的是要考虑CA2241()不会检查方法的使用,因此考虑添加自定义规则这样做可能是值得的。

OK,这是我自己提出的,它在我的代码中看起来是这样的:<代码>格式。不变量(“{ 0 } { 1 }”,ID,名称)和
Format.ForUI
。问题是这只解决了
string.Format
。这不会解决任何其他的警告案件…是的。您可能最终会为经常调用的每个格式化方法创建façade方法对。此外,如果您走这条路线,您应该知道CA2241()不会屏蔽FAXADE,所以您可能需要考虑添加一个自定义规则。对于两个属性<代码>不变量和<代码> UI ,您对静态类<代码>怎么看?code>Invariant只返回
CultureInfo。InvariantCulture
UI
将返回
CultureInfo.CurrentCulture
。这将导致这样的代码:
string.Format(For.Invariant,“{0}-{1}”,id,name)
此外,这可以用于引发CA1305的任何场景,并可以解决CA2241的问题。这只是将检索格式提供程序的方式更改为具有较短名称的类型和属性。就我个人而言,我不会走这条路,因为它用定制的东西代替了众所周知的参考资料,除了较短的名称之外没有任何好处。在写最后一条评论时,我刚刚回忆了另一种主要的方法。我将把它和对CA2241的关注一起添加到我的答案中。