32

您认为真正有必要提供IFormatProvider的方法是String.Format(string, object)什么?

写完整的变体更好吗

String.Format(CultureInfo.CurrentCulture, "String is {0}", str);

要不就

String.Format("String is {0}", str);

?

4

4 回答 4

34

一般来说,如果要以一种独立于当前用户文化的方式(例如,在注册表中或在文件中)保存要生成的字符串,您将希望使用 InvariantCulture。

您将希望将 CurrentCulture 用于要在 UI 中呈现给当前用户的字符串(表单、报告)。

如果您在应该使用 InvariantCulture 的地方使用 CurrentCulture,则可能会出现细微的错误:只有当您有多个具有不同文化的用户访问同一注册表项或文件,或者如果用户更改了他的默认文化时,这些错误才会出现。

显式指定 CurrentCulture (如果省略 IFormatProvider 参数,则为默认值),本质上是证明您已考虑上述内容并且生成的字符串应使用当前用户的文化的文档。这就是 FxCop 建议您指定 IFormatProvider 参数的原因。

于 2009-01-24T11:47:48.113 回答
22

如果您不指定IFormatProvider(或等效地传递null)大多数参数类型最终将落入根据CultureInfo.CurrentCulture. 有趣的是,您可以指定一个自定义IFormatProvider,该自定义可以在格式化参数时首先破解,或者根据其他上下文覆盖格式化文化。

请注意,这CultureInfo.CurrentCulture会影响参数格式,而不是资源选择;资源选择由 控制CultureInfo.CurrentUICulture

于 2009-01-24T03:29:20.630 回答
7

不,您不需要指定文化,除非您的字符串包含文化特定元素,例如小数分隔符、货币等,这些元素必须根据文化呈现。

于 2009-01-24T03:12:39.867 回答
4

如果您关心应用程序中的本地化(全球化),这将特别有用。也就是说,如果您希望您的应用程序支持多种语言和文化特定格式,那么您应该使用它。

于 2009-01-24T02:58:17.573 回答