CA1878: Preferir propriedades ReadOnlySpan em vez de campos de matriz readonly

Propriedade Value
ID da regra CA1878
Título Preferir propriedades ReadOnlySpan em vez de campos de matriz readonly
Categoria Desempenho
Correção é disruptiva ou não disruptiva Inquebrável
Habilitado por padrão no .NET 11 Como sugestão
Idiomas aplicáveis C#

Cause

Um campo de matriz unidimensional estático privado contém valores constantes compatíveis e todos os usos observados podem ser reescritos com segurança para usar uma ReadOnlySpan<T> propriedade.

Descrição da regra

Um campo de matriz readonly estático requer uma alocação de matriz gerenciada. Quando uma ReadOnlySpan<T> propriedade retorna dados constantes com suporte, o compilador C# pode reduzir os dados sem alocar uma matriz gerenciada. Substituir o campo por uma propriedade pode reduzir as alocações, preservando o acesso somente leitura aos dados.

O analisador dá suporte aos seguintes tipos de elemento:

  • bool, bytee sbyte têm suporte sempre que ReadOnlySpan<T> estiver disponível.
  • short, ushort, char, int, uint, float, , long, e double são compatíveis ulongsomente quando a compilação de destino expõe o método estático RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) público. .NET 7 e posteriores, os assemblies de referência expõem esse método.

O analisador não diagnostica matrizes de decimaltipos de enumeraçãonintnuint, structs arbitrários ou tipos de referência. Ele também não diagnostica matrizes irregulares ou matrizes multidimensionais.

Como corrigir violações

Substitua o campo de matriz por uma propriedade encorpada por expressão que retorna ReadOnlySpan<T>.

A correção de código reescreve os usos qualificados do campo. Para chamadas com AsSpan suporte, ele remove uma chamada redundante ou substitui a chamada por uma operação de intervalo equivalente, como Slice. A correção de código não é oferecida quando não pode preservar a semântica de cada uso.

Exemplo

O snippet de código a seguir mostra uma violação da CA1878:

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

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

O snippet 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

Suprime um aviso se você mantiver intencionalmente a identidade ou a mutabilidade da matriz ou se a preservação da compatibilidade da API exigir que o membro permaneça um campo de matriz. A regra relata apenas campos estáticos privados somente leitura cujos usos observados podem ser reescritos com segurança.

Suprimir um aviso

Se você quiser suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desabilitar a regra e, em seguida, habilitá-la novamente.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade 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.

Consulte também