当存在需要的重载IFormatProvider
但代码中未使用此重载时,将引发CA1305 。
例如,以下代码会引发此警告:
string.Format("{0} - {1}", id, name);
摆脱此警告的明显方法是指定要使用的文化:
string.Format(CultureInfo.InvariantCulture, "{0} - {1}", id, name);
但是,我认为这太冗长了。
存在哪些替代方案?
当存在需要的重载IFormatProvider
但代码中未使用此重载时,将引发CA1305 。
例如,以下代码会引发此警告:
string.Format("{0} - {1}", id, name);
摆脱此警告的明显方法是指定要使用的文化:
string.Format(CultureInfo.InvariantCulture, "{0} - {1}", id, name);
但是,我认为这太冗长了。
存在哪些替代方案?
几乎唯一可以减少冗长同时仍然保留显式格式提供程序传递的替代方法是使用特定于文化的外观方法。幸运的是,一种通常仅用于 InvariantCulture 和 CurrentCulture 的格式,因此每个底层格式化方法只需要两种外观方法。
示例代码的典型外观方法可能具有如下签名:
public static string FormatForInvariantCulture(this string template, params object[] substitutions)
并被如下调用:
"{0} - {1}".FormatForInvariantCulture(id, name);
组织外观方法的另一种方法是使用 IoC 技术注入特定于文化的格式化程序类型。例如,可以为格式化定义如下接口:
public interface IFormatter
{
string Format(string template, params object[] substitutions);
}
然后可以将特定于文化的实例注入到需要使用如下构造函数执行格式化的类型中:
public SomeClass(IFormatter systemFormatter, IFormatter uiFormatter)
{
// ...
}
无论外观方法的打包方式如何,重要的是要考虑到 CA2241 ( ProvideCorrectArgumentsToFormattingMethods ) 不会检查方法的使用,因此考虑添加自定义规则来这样做可能是值得的。