Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| 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, esbytesão suportados sempre que ReadOnlySpan<T> está disponível. -
short, , , , , , ,longulong, edoublesó 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.