Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo descreve insights de desempenho para alocações booleanas em caixa.
Motivo
O boxing de valores booleanos no .NET cria alocações de heap cada vez que um bool é convertido para um object tipo de interface ou. Estas alocações, embora pequenas, podem acumular-se rapidamente em caminhos de código críticos de desempenho e causar uma pressão desnecessária na recolha de lixo, especialmente quando os mesmos valores booleanos são repetidamente agrupados.
Descrição do insight de desempenho
Quando um valor booleano é colocado em caixa, o runtime aloca um novo objeto no heap para envolver o tipo de valor. Como existem apenas dois valores booleanos possíveis (true e false), boxar repetidamente estes valores é um desperdício. Em vez de permitir o boxing implícito, é mais eficiente armazenar em cache as instâncias em caixa e reutilizá-las. Pode criar campos estáticos de leitura apenas para os valores em true caixa e false e devolver a instância em cache apropriada quando for necessário fazer boxing.
Como investigar um aviso
Clique no link Investigar para aceder à vista de Alocação que mostra os objetos booleanos alocados. Clicar duas vezes na alocação mostra os caminhos de código onde as alocações estão ocorrendo. Considere reduzir essas alocações ao armazenar em cache os valores booleanos em caixa e devolver as instâncias em cache em vez de permitir operações repetidas de boxing.
Se o Copilot estiver ativado, vês a
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 booleana em caixa e a 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 mais informações sobre como evitar alocações de boxe e outras melhores práticas de desempenho, consulte os seguintes recursos:
Boxe e Desencaixe (Guia de Programação em C#)
CA1841: Dicionário Preferível. Contém métodos (análise de código)
Ao seguir estas orientações, pode garantir que a sua aplicação está otimizada para desempenho e evita sobrecarga desnecessária de boxing.