CA1305:指定 IFormatProvider

属性
规则 ID CA1305
标题 指定 IFormatProvider
类别 全球化
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

对具有接受 System.IFormatProvider 参数的重载,但未调用该重载的方法进行了调用。

此规则会忽略对记录为忽略 IFormatProvider 参数的 .NET 方法的调用。 此规则还会忽略以下方法:

规则说明

如果未提供 System.Globalization.CultureInfoIFormatProvider 对象,则重载成员提供的默认值可能不会在所有区域设置中产生你想要的效果。 此外,.NET 成员根据假设(可能不适合你的代码)选择默认区域性和格式。 为了确保代码满足相应的情况,你应该根据以下准则提供区域性特定的信息:

  • 如果将向用户显示值,则使用当前区域性。 请参阅 CultureInfo.CurrentCulture

  • 若果通过软件存储和访问该值(保留到文件或数据库),则使用固定区域性。 请参阅 CultureInfo.InvariantCulture

  • 如果不知道该值的目标,可要求数据使用者或提供商指定区域性。

即使重载成员的默认行为适合你的需求,最好还是显式调用区域特定的重载,以便代码可以自我记录,且更容易维护。

如何解决冲突

若要解决此规则的冲突,请使用接受 IFormatProvider 参数的重载。 或者,要使用固定区域性,请使用 C# 内插字符串 并将其与 CultureInfo.InvariantCulture 一起传递给 String.Create(IFormatProvider, DefaultInterpolatedStringHandler),例如:

string.Create(CultureInfo.InvariantCulture, $"{major}.{minor}.{build}.{revision}");

何时禁止显示警告

当确定默认格式是正确的选择,并且代码可维护性不是重要的开发优先级时,可禁止显示此规则的警告。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA1305
// The code that's violating the rule is on this line.
#pragma warning restore CA1305

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA1305.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

可以仅为此规则、为适用的所有规则或为适用的此类别(全球化)中的所有规则配置此选项。 有关详细信息,请参阅代码质量规则配置选项

排除特定符号

可以从分析中排除特定符号,如类型和方法。 例如,若要指定规则不应针对名为 MyType 的类型中的任何代码运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

选项值中允许的符号名称格式(用 | 分隔):

  • 仅符号名称(包括具有相应名称的所有符号,不考虑包含的类型或命名空间)。
  • 完全限定的名称,使用符号的文档 ID 格式。 每个符号名称都需要带有一个符号类型前缀,例如表示方法的 M:、表示类型的 T:,以及表示命名空间的 N:
  • .ctor 表示构造函数,.cctor 表示静态构造函数。

示例:

选项值 总结
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType 匹配名为 MyType 的所有符号。
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 匹配名为 MyType1MyType2 的所有符号。
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) 匹配带有指定的完全限定签名的特定方法 MyMethod
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) 匹配带有各自的完全限定签名的特定方法 MyMethod1MyMethod2

排除特定类型及其派生类型

可以从分析中排除特定类型及其派生类型。 例如,若要指定规则不应针对名为 MyType 的类型及其派生类型中的任何代码运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

选项值中允许的符号名称格式(用 | 分隔):

  • 仅类型名称(包括具有相应名称的所有类型,不考虑包含的类型或命名空间)。
  • 完全限定的名称,使用符号的文档 ID 格式,前缀为 T:(可选)。

示例:

选项值 总结
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType 匹配名为 MyType 的所有类型及其所有派生类型。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 匹配名为 MyType1MyType2 的所有类型及其所有派生类型。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType 匹配带有给定的完全限定名称的特定类型 MyType 及其所有派生类型。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 匹配带有各自的完全限定名称的特定类型 MyType1MyType2 及其所有派生类型。

示例

在以下代码中,example1 字符串与规则 CA1305 冲突。 example2 字符串通过将 CultureInfo.CurrentCulture(实现 IFormatProvider)传递到 String.Format(IFormatProvider, String, Object) 来满足规则 CA1305。 example3 字符串通过将内插字符串与 CultureInfo.InvariantCulture 一起传递到 String.Create(IFormatProvider, DefaultInterpolatedStringHandler) 来满足规则 CA1305 的要求。

string name = "Georgette";

// Violates CA1305
string example1 = string.Format("Hello {0}", name);

// Satisfies CA1305
string example2 = string.Format(CultureInfo.CurrentCulture, "Hello {0}", name);

// Satisfies CA1305
string example3 = string.Create(CultureInfo.InvariantCulture, $"Hello {name}");

另请参阅