CA1861: Evitar matrizes constantes como argumentos

Property Valor
ID da regra CA1861
Título Evite matrizes constantes como argumentos
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

Uma matriz constante, de valores literais, é passada para um método por meio de uma invocação regular ou invocação de método de extensão.

Descrição da regra

Matrizes constantes passadas como argumentos não são reutilizados quando chamados repetidamente, o que implica que uma nova matriz é criada a cada vez. Se a matriz passada não for alterada dentro do método chamado, você deve extraí-la para um campo static readonly para melhorar o desempenho.

Observação

Se o método chamado alterar a matriz passada ou se você não tiver certeza se o método alteraria a matriz, não extraia a matriz para um campo static readonly. Fazer isso pode ser uma alteração interruptiva. Nesse caso, é melhor suprimir o aviso.

Como corrigir violações

Extraia matrizes constantes para campos static readonly se a matriz passada não for alterada dentro do método chamado.

O exemplo a seguir mostra duas violações da regra:

// A method argument
string message = string.Join(" ", new[] { "Hello", "world!" });
' A method argument
Dim message As String = String.Join(" ", {"Hello", "world!"})

O exemplo a seguir mostra como a violação dessa regra é corrigida extraindo o argumento para um campo static readonly.

private static readonly string[] array = new[] { "Hello" , "world!" };

private string GetMessage()
{
    return string.Join(" ", array);
}
Private Shared ReadOnly array As String() = {"Hello", "world!"}

Private Function GetMessage() As String
    Return String.Join(" ", array)
End Function

Agora, o valor da matriz é resolvido em tempo de compilação em vez de em tempo de execução, tornando o código mais eficaz.

Quando suprimir avisos

Suprima uma violação dessa regra se:

  • A invocação só for executada uma vez.
  • A matriz pode ser alterada dentro do método invocado ou você não tem certeza se ela sofrerá mutação.
  • Você não está preocupado com o impacto no desempenho da criação de uma matriz constante para cada invocação.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

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

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.CA1861.severity = none

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