Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
| 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,byteesbytetêm suporte sempre que ReadOnlySpan<T> estiver disponível. -
short,ushort,char,int,uint,float, ,long, edoublesão compatíveisulongsomente 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.