CA1305:指定文化时的详细程度

Dan*_*rth 6 .net c# code-analysis localization

当存在需要的IFormatProvider过载但在代码中未使用此过载时,CA1305会引发.

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

string.Format("{0} - {1}", id, name);
Run Code Online (Sandbox Code Playgroud)

摆脱此警告的明显方法是指定要使用的文化:

string.Format(CultureInfo.InvariantCulture, "{0} - {1}", id, name);
Run Code Online (Sandbox Code Playgroud)

但是,我觉得这太冗长了.

有哪些替代品?

Nic*_*oiu 2

几乎唯一可以减少冗长同时仍保留显式格式提供程序传递的替代方案是使用特定于区域性的 fa\xc3\xa7ade 方法。幸运的是,通常仅针对 InvariantCulture 和 CurrentCulture 进行格式化,因此每种底层格式化方法只需要两个 fa\xc3\xa7ade 方法。

\n\n

示例代码的典型 fa\xc3\xa7ade 方法可能具有如下签名:

\n\n
public static string FormatForInvariantCulture(this string template, params object[] substitutions)\n
Run Code Online (Sandbox Code Playgroud)\n\n

并被称为如下:

\n\n
"{0} - {1}".FormatForInvariantCulture(id, name);\n
Run Code Online (Sandbox Code Playgroud)\n\n

组织 fa\xc3\xa7ade 方法的另一种方法是使用 IoC 技术注入特定于文化的格式化程序类型。例如,可以定义如下接口用于格式化:

\n\n
public interface IFormatter\n{\n    string Format(string template, params object[] substitutions);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后可以将特定于文化的实例注入到需要使用构造函数执行格式化的类型中,如下所示:

\n\n
public SomeClass(IFormatter systemFormatter, IFormatter uiFormatter)\n{\n    // ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

无论 fa\xc3\xa7ade 方法的打包方式如何,重要的是要考虑 CA2241 ( ProvideCorrectArgumentsToFormattingMethods ) 不会检查方法的使用情况,因此可能值得考虑添加自定义规则来执行此操作。

\n