CA1878: Prefira propriedades ReadOnlySpan em vez de campos de array readonly

Property Value
ID da regra CA1878
Título Prefiro propriedades ReadOnlySpan em vez de campos de array apenas de leitura
Categoria Desempenho
A correção é invasiva ou não invasiva Inquebrável
Ativado por defeito no .NET 11 Propomos a seguinte sugestão.
Línguas aplicáveis C#

Cause

Um campo privado de array unidimensional estático e apenas leitura contém valores constantes suportados, e todos os usos observados podem ser reescritos com segurança para usar uma ReadOnlySpan<T> propriedade.

Descrição da regra

Um campo estático de array só de leitura requer uma alocação gerida de arrays. Quando uma ReadOnlySpan<T> propriedade devolve dados constantes suportados, o compilador C# pode reduzir os dados sem alocar um array gerido. Substituir o campo por uma propriedade pode reduzir as alocações, preservando o acesso apenas de leitura aos dados.

O analisador suporta os seguintes tipos de elementos:

  • bool, byte, e sbyte são suportados sempre que ReadOnlySpan<T> está disponível.
  • short, , , , , , , longulong, e double só são suportadas quando a compilação de destino expõe o método estático RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) público. floatuintintcharushort .NET 7 e assemblagens de referência posteriores expõem este método.

O analisador não diagnostica arrays de decimal, nint, nuint, tipos enum, estruturas arbitrárias ou tipos de referência. Também não diagnostica matrizes irregulares ou multidimensionais.

Como corrigir violações

Substitua o campo array por uma propriedade de corpo de expressão que devolve ReadOnlySpan<T>.

A correção de código reescreve os usos elegíveis do campo. Para chamadas suportadas AsSpan , remove uma chamada redundante ou substitui a chamada por uma operação span equivalente, como Slice. A correção do código não é oferecida quando não consegue preservar a semântica de cada uso.

Example

O seguinte excerto de código mostra uma violação do CA1878:

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

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

O trecho de código a seguir corrige a violação:

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

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

Quando suprimir avisos

Suprima um aviso se intencionalmente mantiver a identidade ou mutabilidade do array, ou se preservar a compatibilidade da API exigir que o membro continue a ser um campo de array. A regra apenas reporta campos privados estáticos de leitura apenas cujos usos observados podem ser reescritos em segurança.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Ver também