Compartilhar via


Alocações boolianas em caixa

Este artigo descreve os insights de desempenho para alocações boolianas em caixa.

Motivo

Valores boolianos de boxe no .NET criam alocações de heap sempre que um bool é convertido em um object tipo ou interface. Essas alocações, embora pequenas, podem se acumular rapidamente em caminhos de código críticos ao desempenho e causar pressão desnecessária de coleta de lixo, especialmente quando os mesmos valores boolianos são encaixoados repetidamente.

Descrição do insight de desempenho

Quando um valor booliano é ajustado, o runtime aloca um novo objeto no heap para encapsular o tipo de valor. Como há apenas dois valores boolianos possíveis (true e false), a conversão repetida desses valores é um desperdício. Em vez de permitir o boxe implícito, é mais eficiente armazenar em cache as instâncias em caixa e reutilizá-las. Você pode criar campos estáticos somente leitura para os valores e boxed true e false retornar a instância em cache apropriada quando o boxing for necessário.

Como investigar um aviso

Clique no link Investigar para ir para o modo de exibição Alocação mostrando os objetos boolianos alocados em caixa. Clicar duas vezes na alocação mostra os caminhos de código em que as alocações estão ocorrendo. Considere reduzir essas alocações armazenando em cache os valores boolianos em caixa e retornando as instâncias armazenadas em cache em vez de permitir operações de boxe repetidas.

Se o Copilot estiver habilitado, você verá a captura de tela do Ask Copilotdo botão Perguntar Copilot. Selecione o botão e o Copilot fornece uma análise detalhada dos padrões de alocação e sugere correções de código para otimizar o uso da memória.

Aqui está um exemplo de uma alocação booliana em caixa e sua resolução:

Violação:

class Example
{
    public object GetResult(bool condition)
    {
        return condition; // Implicit boxing occurs here
    }
}

Resolução:

class Example
{
    private static readonly object BoxedTrue = true;
    private static readonly object BoxedFalse = false;

    public object GetResult(bool condition)
    {
        return condition ? BoxedTrue : BoxedFalse;
    }
}

Recursos adicionais

Para obter mais informações sobre como evitar alocações de boxe e outras práticas recomendadas de desempenho, consulte os seguintes recursos:

Boxing e Unboxing (Guia de Programação em C#)

CA1841: Preferir métodos Dictionary.Contains (análise de código)

Seguindo essas diretrizes, você pode garantir que seu aplicativo seja otimizado para desempenho e evite sobrecarga de boxe desnecessária.