CA1878:首选 ReadOnlySpan 属性而不是只读数组字段

财产 价值
规则 ID CA1878
标题 首选 ReadOnlySpan 属性而不是只读数组字段
Category 性能
修复是破坏性还是非破坏性 Non-breaking
默认在 .NET 11 中启用 作为一种建议
适用的语言 C#

原因

私有静态只读一维数组字段包含支持的常量值,并且所有观察到的用法都可以安全地重写以使用 ReadOnlySpan<T> 属性。

规则说明

静态只读数组字段需要托管数组分配。 ReadOnlySpan<T>当属性返回支持的常量数据时,C# 编译器可以降低数据而不分配托管数组。 将字段替换为属性可以减少分配,同时保留对数据的只读访问权限。

分析器支持以下元素类型:

分析器不会诊断 、、nintnuint枚举类型、任意结构或引用类型的数组decimal。 它也不会诊断杂乱的数组或多维数组。

如何修复违规行为

将数组字段替换为返回 ReadOnlySpan<T>的 expression-bodied 属性。

代码修复重写字段的合格用法。 对于支持的 AsSpan 调用,它将删除冗余调用,或者将调用替换为等效的跨度操作,例如 Slice。 当代码无法保留每个用法的语义时,不会提供代码修补程序。

Example

以下代码片段显示了 CA1878 的冲突:

class CA1878ViolationExample
{
    private static readonly byte[] Prefix = new byte[] { 0x50, 0x4B, 0x03, 0x04 };

    public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}

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

class CA1878FixExample
{
    private static ReadOnlySpan<byte> Prefix => new byte[] { 0x50, 0x4B, 0x03, 0x04 };

    public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}

何时禁止显示警告

如果有意保留数组的标识或可变性,或者保留 API 兼容性要求成员保留数组字段,则禁止显示警告。 规则仅报告可安全重写其观察到用法的专用静态只读字段。

禁止显示警告

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

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

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

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

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

另见