| 财产 | 价值 |
|---|---|
| 规则 ID | CA1878 |
| 标题 | 首选 ReadOnlySpan 属性而不是只读数组字段 |
| Category | 性能 |
| 修复是破坏性还是非破坏性 | Non-breaking |
| 默认在 .NET 11 中启用 | 作为一种建议 |
| 适用的语言 | C# |
原因
私有静态只读一维数组字段包含支持的常量值,并且所有观察到的用法都可以安全地重写以使用 ReadOnlySpan<T> 属性。
规则说明
静态只读数组字段需要托管数组分配。 ReadOnlySpan<T>当属性返回支持的常量数据时,C# 编译器可以降低数据而不分配托管数组。 将字段替换为属性可以减少分配,同时保留对数据的只读访问权限。
分析器支持以下元素类型:
-
bool,byte并且sbyte每当可用时 ReadOnlySpan<T> 都受支持。 -
short仅当目标编译公开公共静态方法时,才支持 、ushort、charuintint、float、long、 和。ulongdoubleRuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) .NET 7 和更高版本的引用程序集公开此方法。
分析器不会诊断 、、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
有关详细信息,请参阅 如何禁止显示代码分析警告。