CA1870:使用缓存的“SearchValues”实例
属性 | 值 |
---|---|
规则 ID | CA1870 |
标题 | 使用缓存的“SearchValues”实例 |
类别 | “性能” |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 9 中默认启用 | 作为建议 |
原因
在调用 IndexOfAny
或 ContainsAny
方法时使用很多常量值,这样可从改用 SearchValues 中获益。
此规则不会标记所用值不超过 5 个的调用,因为这些调用已经使用最佳实现。
规则说明
与将值直接传递给 SearchValues<T> 或 IndexOfAny
相比,使用缓存的 ContainsAny
更加高效。
如何解决冲突
在 SearchValues<T> 字段中创建和缓存 static readonly
实例,然后将该实例传递给 IndexOfAny
或 ContainsAny
调用。
自动执行此转换的
示例
以下代码片段显示了 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
有关详细信息,请参阅如何禁止显示代码分析警告。