Partilhar via


CA1841: Prefer Dictionary contém métodos

Property valor
ID da regra CA1841
Título Prefer Dictionary Contém métodos
Categoria Desempenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 10 Como sugestão

Motivo

Esta regra localiza chamadas para um Contains método no Keys ou Values coleção de um IDictionary<TKey,TValue> que pode ser substituído por uma chamada para um ContainsKey ou ContainsValue método no próprio dicionário.

Descrição da regra

Chamar Contains a coleção ou Keys muitas vezes pode ser mais caro Values do que ligar ContainsKey ou ContainsValue no próprio dicionário:

  • Muitas implementações de dicionário instanciam preguiçosamente as coleções de chaves e valores, o que significa que o acesso à Keys coleção ou Values pode resultar em alocações extras.
  • Você pode acabar chamando um método de extensão se IEnumerable<T> a coleção de chaves ou valores usar a implementação de interface explícita para ocultar métodos no ICollection<T>. Isso pode levar a um desempenho reduzido, especialmente ao acessar a coleção de chaves. A maioria das implementações de dicionário são capazes de fornecer uma verificação de contenção O(1) rápida para chaves, enquanto o método de extensão em Contains geralmente faz uma verificação de contenção O(n) lentaIEnumerable<T>.

Como corrigir violações

Para corrigir violações, substitua chamadas para dictionary.Keys.Contains ou dictionary.Values.Contains por chamadas para dictionary.ContainsKey ou dictionary.ContainsValue, respectivamente.

O trecho de código a seguir mostra exemplos de violações e como corrigi-las.

using System.Collections.Generic;
// Importing this namespace brings extension methods for IEnumerable<T> into scope.
using System.Linq;

class Example
{
    void Method()
    {
        var dictionary = new Dictionary<string, int>();

        //  Violation
        dictionary.Keys.Contains("hello world");

        //  Fixed
        dictionary.ContainsKey("hello world");

        //  Violation
        dictionary.Values.Contains(17);

        //  Fixed
        dictionary.ContainsValue(17);
    }
}
Imports System.Collection.Generic
' Importing this namespace brings extension methods for IEnumerable(Of T) into scope.
' Note that in Visual Basic, this namespace is often imported automatically throughout the project.
Imports System.Linq

Class Example
    Private Sub Method()
        Dim dictionary = New Dictionary(Of String, Of Integer)

        ' Violation
        dictionary.Keys.Contains("hello world")

        ' Fixed
        dictionary.ContainsKey("hello world")

        ' Violation
        dictionary.Values.Contains(17)

        ' Fixed
        dictionary.ContainsValue(17)
    End Sub
End Class

Quando suprimir avisos

É seguro suprimir avisos dessa regra se o código em questão não for crítico para o desempenho.

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 CA1841
// The code that's violating the rule is on this line.
#pragma warning restore CA1841

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA1841.severity = none

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

Consulte também