CA1862:使用 'StringComparison' 方法重载执行不区分大小写的字符串比较

属性
规则 ID CA1862
标题 使用 'StringComparison' 方法重载执行不区分大小写的字符串比较
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为建议

原因

代码通过首先对一个或两个字符串调用 ToLower()ToLowerInvariant()ToUpper()ToUpperInvariant() 来以不区分大小写的方式比较两个字符串。

规则说明

当代码调用 ToLower()ToLowerInvariant()ToUpper()ToUpperInvariant() 时执行分配。 如果调用这些方法的唯一原因是执行不区分大小写的字符串比较或搜索,则分配不是必要的。 可以改为调用一个接受 StringComparison 的字符串比较方法,并指定其中一个 *IgnoreCase 值。

如何解决冲突

移除对 ToLower()ToLowerInvariant()ToUpper()ToUpperInvariant() 的调用,并调用 StringComparer 方法中的某一个,或以下接受 StringComparison 参数的某个方法:

注意

  • 如果将代码更改为使用接受 StringComparison 参数的重载,则可能会导致行为发生微妙变化。 如果要进行此更改或接受 Visual Studio 的灯泡建议,请务必进行彻底的测试。
  • 如果字符串不需要以文化敏感的方式进行比较,请考虑传递 StringComparison.OrdinalIgnoreCase

示例

以下示例显示了规则的冲突:

string s1 = "aBc";
string s2 = "aBC";

int _ = s1.ToUpper().CompareTo(s2.ToUpper());
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"

Dim i As Integer = s1.ToUpper().CompareTo(s2.ToUpper())

下面的示例展示了修复违反情况的代码:

string s1 = "aBc";
string s2 = "aBC";

int _ = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2);
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"

Dim i As Integer = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2)

何时禁止显示警告

如果不担心性能问题,则抑制来自此规则的警告是安全的。

如果使用 Entity Framework Core (EF Core),则应通过比较字符串来取消此规则,以便查询数据库。 如果使用采用参数 StringComparison 的方法(如 String.Equals(String, StringComparison)),EF Core 将引发异常,因为它不会将此类查询转换为 SQL。 有关详细信息,请参阅内置 .NET 字符串操作的转换

抑制警告

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

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

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

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

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