Regras de desempenho
As regras de desempenho suportam bibliotecas e aplicativos de alto desempenho.
Nesta secção
Regra | Description |
---|---|
CA1802: Use literais quando apropriado | Um campo é declarado estático e somente leitura (Shared e ReadOnly no Visual Basic) e é inicializado com um valor que é computável em tempo de compilação. Como o valor atribuído ao campo de destino é computável em tempo de compilação, altere a declaração para um campo const (Const no Visual Basic) para que o valor seja calculado em tempo de compilação em vez de em tempo de execução. |
CA1805: Não inicializar desnecessariamente | O tempo de execução do .NET inicializa todos os campos de tipos de referência para seus valores padrão antes de executar o construtor. Na maioria dos casos, inicializar explicitamente um campo com seu valor padrão é redundante, o que aumenta os custos de manutenção e pode degradar o desempenho (como com o aumento do tamanho da montagem). |
CA1806: Não ignore os resultados do método | Um novo objeto é criado, mas nunca usado, ou um método que cria e retorna uma nova cadeia de caracteres é chamado e a nova cadeia de caracteres nunca é usada, ou um método COM (Component Object Model) ou P/Invoke retorna um HRESULT ou código de erro que nunca é usado. |
CA1810: Inicializar campos estáticos do tipo de referência embutidos | Quando um tipo declara um construtor estático explícito, o compilador just-in-time (JIT) adiciona uma verificação a cada método estático e construtor de instância do tipo para certificar-se de que o construtor estático foi chamado anteriormente. As verificações estáticas do construtor podem diminuir o desempenho. |
CA1812: Evite classes internas não instanciadas | Uma instância de um tipo de nível de assembly não é criada por código no assembly. |
CA1813: Evite atributos não selados | O .NET fornece métodos para recuperar atributos personalizados. Por padrão, esses métodos pesquisam a hierarquia de herança de atributos. A selagem do atributo elimina a pesquisa através da hierarquia de herança e pode melhorar o desempenho. |
CA1814: Prefira matrizes irregulares em vez de multidimensionais | Uma matriz irregular é uma matriz cujos elementos são matrizes. As matrizes que compõem os elementos podem ser de tamanhos diferentes, o que pode resultar em menos espaço desperdiçado para alguns conjuntos de dados. |
CA1815: Substituir é igual e operador é igual em tipos de valor | Para tipos de valor, a implementação herdada de Equals usa a biblioteca Reflection e compara o conteúdo de todos os campos. A reflexão é computacionalmente cara, e comparar todos os campos para a igualdade pode ser desnecessário. Se você espera que os usuários comparem ou classifiquem instâncias, ou usem instâncias como chaves de tabela de hash, seu tipo de valor deve implementar Equals. |
CA1819: As propriedades não devem retornar matrizes | As matrizes retornadas por propriedades não são protegidas contra gravação, mesmo que a propriedade seja somente leitura. Para manter a matriz inviolável, a propriedade deve retornar uma cópia da matriz. Normalmente, os usuários não entenderão as implicações de desempenho adverso de chamar tal propriedade. |
CA1820: Teste para cadeias de caracteres vazias usando o comprimento da cadeia de caracteres | Comparar cadeias de caracteres usando a propriedade String.Length ou o método String.IsNullOrEmpty é significativamente mais rápido do que usar Equals. |
CA1821: Remover finalizadores vazios | Sempre que puder, evite finalizadores devido à sobrecarga de desempenho adicional envolvida no controle da vida útil do objeto. Um finalizador vazio incorre em sobrecarga adicional sem qualquer benefício. |
CA1822: Marcar membros como estáticos | Os membros que não acessam dados de instância ou métodos de instância de chamada podem ser marcados como estáticos (Compartilhado no Visual Basic). Depois de marcar os métodos como estáticos, o compilador emitirá sites de chamada não virtuais para esses membros. Isso pode proporcionar um ganho de desempenho mensurável para código sensível ao desempenho. |
CA1823: Evite campos privados não utilizados | Foram detetados campos privados que não parecem ser acessados no assembly. |
CA1824: Marcar assemblies com NeutralResourcesLanguageAttribute | O atributo NeutralResourcesLanguage informa o Resource Manager sobre a linguagem que foi usada para exibir os recursos de uma cultura neutra para um assembly. Isso melhora o desempenho de pesquisa para o primeiro recurso que você carrega e pode reduzir seu conjunto de trabalho. |
CA1825: Evite alocações de array de comprimento zero | A inicialização de uma matriz de comprimento zero leva a uma alocação de memória desnecessária. Em vez disso, use a instância de matriz vazia alocada estaticamente chamando Array.Empty. A alocação de memória é compartilhada em todas as invocações desse método. |
CA1826: Use a propriedade em vez do método Linq Enumerable | Enumerable O método LINQ foi usado em um tipo que suporta uma propriedade equivalente e mais eficiente. |
CA1827: Não use Count/LongCount quando algum pode ser usado | Count ou LongCount método onde Any o método seria mais eficiente. |
CA1828: Não use CountAsync/LongCountAsync quando AnyAsync pode ser usado | CountAsync ou LongCountAsync método onde AnyAsync o método seria mais eficiente. |
CA1829: Use a propriedade Length/Count em vez do método Enumerable.Count | CountO método LINQ foi usado em um tipo que suporta uma propriedade ou Count equivalente, mais eficienteLength . |
CA1830: Prefira sobrecargas de método Append e Insert fortemente tipadas no StringBuilder | Append e Insert fornecer sobrecargas para vários tipos além de System.String. Quando possível, prefira as sobrecargas fortemente tipadas em vez de usar ToString() e a sobrecarga baseada em cadeia de caracteres. |
CA1831: Use AsSpan em vez de indexadores baseados em intervalo para cadeia de caracteres quando apropriado | Ao usar um indexador de intervalo em uma cadeia de caracteres e atribuir implicitamente o valor a um tipo de char ReadOnlySpan<, o método Substring será usado em vez de Slice, que produz uma cópia da parte solicitada da cadeia de caracteres.> |
CA1832: Use AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte ReadOnlySpan ou ReadOnlyMemory de uma matriz | Ao usar um indexador de intervalo em uma matriz e atribuir implicitamente o valor a um ReadOnlySpan<T> ou ReadOnlyMemory<T> tipo, o método GetSubArray será usado em vez de Slice, que produz uma cópia da parte solicitada da matriz. |
CA1833: Use AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte Span ou Memory de uma matriz | Ao usar um indexador de intervalo em uma matriz e atribuir implicitamente o valor a um Span<T> ou Memory<T> tipo, o método GetSubArray será usado em vez de Slice, que produz uma cópia da parte solicitada da matriz. |
CA1834: Use StringBuilder.Append(char) para cadeias de caracteres únicos | StringBuilder tem uma Append sobrecarga que toma um char como argumento. Prefira chamar a sobrecarga para melhorar o char desempenho. |
CA1835: Prefira as sobrecargas baseadas em 'Memória' para 'ReadAsync' e 'WriteAsync' | 'Stream' tem uma sobrecarga 'ReadAsync' que usa um 'Memory<Byte>' como o primeiro argumento e uma sobrecarga 'WriteAsync' que usa um 'ReadOnlyMemory<Byte>' como o primeiro argumento. Prefira chamar as sobrecargas baseadas em memória, que são mais eficientes. |
CA1836: Prefira IsEmpty quando Count disponível |
Prefira IsEmpty a propriedade que seja mais eficiente do que Count , Length Count<TSource>(IEnumerable<TSource>) ou LongCount<TSource>(IEnumerable<TSource>) para determinar se o objeto contém ou não nenhum item. |
CA1837: Use Environment.ProcessId em vez de Process.GetCurrentProcess().Id |
Environment.ProcessId é mais simples e mais rápido do que Process.GetCurrentProcess().Id . |
CA1838: Evite StringBuilder parâmetros para P/Invokes |
O marshalling de sempre cria uma cópia de buffer nativa, resultando em várias alocações para uma operação de StringBuilder empacotamento. |
CA1839: Use Environment.ProcessPath em vez de Process.GetCurrentProcess(). MainModule.FileName | Environment.ProcessPath é mais simples e mais rápido do que Process.GetCurrentProcess().MainModule.FileName . |
CA1840: Use Environment.CurrentManagedThreadId em vez de Thread.CurrentThread.ManagedThreadId | Environment.CurrentManagedThreadId é mais compacto e eficiente do que Thread.CurrentThread.ManagedThreadId . |
CA1841: Prefer Dictionary contém métodos | Recorrer Contains à coleção ou Values pode muitas vezes ser mais dispendioso Keys do que telefonar ContainsKey ou ContainsValue recorrer ao próprio dicionário. |
CA1842: Não use 'WhenAll' com uma única tarefa | Usar WhenAll com uma única tarefa pode resultar em perda de desempenho. Aguarde ou retorne a tarefa. |
CA1843: Não use 'WaitAll' com uma única tarefa | Usar WaitAll com uma única tarefa pode resultar em perda de desempenho. Aguarde ou retorne a tarefa. |
CA1844: Fornecer substituições baseadas em memória de métodos assíncronos ao subclassificar 'Stream' | Para melhorar o desempenho, substitua os métodos assíncronos baseados em memória ao subclassificar 'Stream'. Em seguida, implemente os métodos baseados em matriz em termos de métodos baseados em memória. |
CA1845: Use a cadeia de caracteres baseada em span. Concat» | É mais eficiente para usar AsSpan e string.Concat , em vez de e um operador de Substring concatenação. |
CA1846: Prefira AsSpan mais Substring |
AsSpan é mais eficiente do que Substring . Substring executa uma cópia de cadeia de caracteres O(n), enquanto AsSpan não e tem um custo constante. AsSpan também não executa nenhuma alocação de heap. |
CA1847: Use literal de caracteres para uma pesquisa de um único caractere | Use String.Contains(char) em vez de String.Contains(string) ao procurar um único caractere. |
CA1848: Usar os delegados LoggerMessage | Para melhorar o desempenho, use os LoggerMessage delegados. |
CA1849: Chamar métodos assíncronos quando em um método assíncrono | Em um método que já é assíncrono, as chamadas para outros métodos devem ser para suas versões assíncronas, quando existirem. |
CA1850: Prefira o método estático HashData em vez do ComputeHash |
É mais eficiente usar o método estático HashData em vez de criar e gerenciar uma HashAlgorithm instância para chamar ComputeHash . |
CA1851: Possíveis enumerações múltiplas de IEnumerable coleção |
Possíveis enumerações múltiplas de IEnumerable coleção. Considere o uso de uma implementação que evite várias enumerações. |
CA1852: Tipos internos de vedação | Um tipo que não é acessível fora de sua montagem e não tem subtipos dentro de sua montagem de contenção não é lacrado. |
CA1853: Chamada desnecessária para 'Dictionary.ContainsKey(key)' | Não há necessidade de se proteger Dictionary.Remove(key) com Dictionary.ContainsKey(key) . Dictionary<TKey,TValue>.Remove(TKey) já verifica se a chave existe e não lança se não existir. |
CA1854: Prefira o método 'IDictionary.TryGetValue(TKey, out TValue)' | Prefira 'TryGetValue' em vez de um acesso ao indexador de dicionário protegido por uma verificação 'ContainsKey'. 'ContainsKey' e o indexador procuram a chave, portanto, usar 'TryGetValue' evita a pesquisa extra. |
CA1855: Use o Span<T>. Clear() em vez de Span<T>. Preenchimento() | É mais eficiente chamar Span<T>.Clear() do que chamar Span<T>.Fill(T) para preencher os elementos da extensão com um valor padrão. |
CA1856: Uso incorreto do atributo ConstantExpected | O ConstantExpectedAttribute atributo não é aplicado corretamente em um parâmetro. |
CA1857: O parâmetro espera uma constante para um desempenho ideal | Um argumento inválido é passado para um parâmetro anotado com ConstantExpectedAttribute. |
CA1858: Use StartsWith em vez de IndexOf | É mais eficiente chamar String.StartsWith do que chamar String.IndexOf para verificar se uma cadeia de caracteres começa com um determinado prefixo. |
CA1859: Use tipos de concreto quando possível para melhorar o desempenho | O código usa tipos de interface ou tipos abstratos, levando a chamadas de interface desnecessárias ou chamadas virtuais. |
CA1860: Evite usar o método de extensão 'Enumerable.Any()' | É mais eficiente e claro usar Length , Count ou IsEmpty (se possível) do que chamar Enumerable.Any para determinar se um tipo de coleção tem algum elemento. |
CA1861: Evite matrizes constantes como argumentos | Matrizes constantes passadas como argumentos não são reutilizadas, o que implica uma sobrecarga de desempenho. Considere extraí-los para campos "somente leitura estática" para melhorar o desempenho. |
CA1862: Use as sobrecargas do método 'StringComparison' para executar comparações de cadeia de caracteres que não diferenciam maiúsculas de minúsculas | Quando o código chama ToLower() ou ToUpper() para executar uma comparação de cadeia de caracteres que não diferencia maiúsculas de minúsculas, uma alocação desnecessária é executada. |
CA1863: Use 'CompositeFormat' | Para reduzir o custo de formatação, armazene em cache e use uma CompositeFormat instância como argumento para String.Format ou StringBuilder.AppendFormat . |
CA1864: Prefira o método 'IDictionary.TryAdd(TKey, TValue)' | Ambos Dictionary<TKey,TValue>.ContainsKey(TKey) e Dictionary<TKey,TValue>.Add realizar uma pesquisa, que é redundante. É mais eficiente chamar Dictionary<TKey,TValue>.TryAdd, que retorna uma bool indicação se o valor foi adicionado ou não. TryAdd não substitui o valor da chave se ela já estiver presente. |
CA1865-CA1867: Usar sobrecarga de caracteres | A sobrecarga char é uma sobrecarga de melhor desempenho para uma string com um único char. |
CA1868: Chamada desnecessária para 'Contém' para conjuntos | Ambos ISet<T>.Add(T) e ICollection<T>.Remove(T) realizar uma pesquisa, o que torna redundante ligar ICollection<T>.Contains(T) antecipadamente. É mais eficiente chamar Add(T) ou Remove(T) diretamente, o que retorna um valor booleano indicando se o item foi adicionado ou removido. |
CA1869: Armazenar em cache e reutilizar instâncias 'JsonSerializerOptions' | Usar uma instância local de JsonSerializerOptions para serialização ou desserialização pode degradar substancialmente o desempenho do seu aplicativo se o código for executado várias vezes, já que System.Text.Json armazena internamente em cache metadados relacionados à serialização na instância fornecida. |
CA1870: Usar uma instância 'SearchValues' armazenada em cache | Usar uma instância armazenada em SearchValues<T> cache é mais eficiente do que passar valores para 'IndexOfAny' ou 'ContainsAny' diretamente. |
CA1871: Não passe uma struct anulável para 'ArgumentNullException.ThrowIfNull' | 'ArgumentNullException.ThrowIfNull' aceita um 'objeto', portanto, passar uma struct anulável pode fazer com que o valor seja encaixotado. |
CA1872: Prefira 'Convert.ToHexString' e 'Convert.ToHexStringLower' em vez de cadeias de chamadas baseadas em 'BitConverter.ToString' | Use Convert.ToHexString ou Convert.ToHexStringLower ao codificar bytes para uma representação de cadeia de caracteres hexadecimal. Esses métodos são mais eficientes e fáceis de alocação do que usar BitConverter.ToString em combinação com String.Replace para substituir traços e String.ToLower. |
Colabore connosco no GitHub
A origem deste conteúdo pode ser encontrada no GitHub, onde também pode criar e rever problemas e pedidos Pull. Para mais informações, consulte o nosso guia do contribuidor.