CA1870:使用缓存的“SearchValues”实例

属性
规则 ID CA1870
标题 使用缓存的“SearchValues”实例
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 9 中默认启用 作为建议

原因

在调用 IndexOfAnyContainsAny 方法时使用很多常量值,这样可从改用 SearchValues 中获益。

此规则不会标记所用值不超过 5 个的调用,因为这些调用已经使用最佳实现。

规则说明

与将值直接传递给 SearchValues<T>IndexOfAny 相比,使用缓存的 ContainsAny 更加高效。

如何解决冲突

SearchValues<T> 字段中创建和缓存 static readonly 实例,然后将该实例传递给 IndexOfAnyContainsAny 调用。

自动执行此转换的 代码修复可用。

示例

以下代码片段显示了 CA1870 的两个冲突:

static readonly char[] MyValues = new[] { 'a', 'b', 'c', 'x', 'y', 'z' };

static int IndexOfMyValues(ReadOnlySpan<char> text)
{
    return text.IndexOfAny(MyValues);
}

static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
    return !text.ContainsAnyExcept("abcxyz");
}

以下代码片段修复了冲突:

private static readonly SearchValues<char> s_myValues = SearchValues.Create("abcxyz");

static int IndexOfMyValues(ReadOnlySpan<char> text)
{
    return text.IndexOfAny(s_myValues);
}

static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
    return !text.ContainsAnyExcept(s_myValues);
}

如果使用同一组值对 IndexOfAny 进行多次调用,应重用 s_myValues

何时禁止显示警告

如果不考虑性能,则可以安全地禁止显示此警告。

抑制警告

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

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

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

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

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