Asserções em código gerenciado
Uma asserção, ou instrução Assert
, testa uma condição, que você especifica como um argumento para a instrução Assert
. Se a condição for avaliada para true, nenhuma ação ocorrerá. Se a condição for avaliada como false, haverá falha de asserção. Se você estiver executando um build de depuração, seu programa entrará no modo de interrupção.
Neste tópico
Asserções in no namespace System.Diagnostics
Efeitos colaterais de Debug.Assert
Requisitos de rastreamento e depuração
Personalizar o comportamento de asserção
Configurar asserções nos arquivos de configuração
Asserções in no namespace System.Diagnostics
No Visual Basic e Visual C #, você pode usar o método Assert
de Debug ou Trace, que estão no namespace System.Diagnostics. Os métodos da classe Debug não estão incluídos em uma versão de lançamento do programa, portanto, não aumentam o tamanho nem reduzem a velocidade do código da versão.
A linguagem C++ não oferece suporte aos métodos da classe Debug. Você pode obter o mesmo efeito usando a classe Trace com compilação condicional, por exemplo, #ifdef DEBUG
… #endif
.
O método Debug.Assert
Use o método System.Diagnostics.Debug.Assert livremente para testar condições que devem resultar em valores verdadeiros se seu código estiver correto. Por exemplo, suponha que você tenha escrito uma função de divisão de inteiros. Pelas regras da matemática, o divisor nunca pode ser zero. Você pode testar isso usando uma asserção:
int IntegerDivide ( int dividend , int divisor )
{
Debug.Assert ( divisor != 0 );
return ( dividend / divisor );
}
Quando você executar esse código no depurador, a instrução de asserção será avaliada, mas, na versão lançada, a comparação não é feita, para não haver sobrecarga adicional.
Veja a seguir outro exemplo. Você tem uma classe que implementa uma conta corrente, como segue:
float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );
Antes de retirar o dinheiro da conta, você quer garantir que o saldo seja suficiente para cobrir o valor que quer sacar. Você pode escrever uma asserção para verificar o saldo:
float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );
Observe que as chamadas para o método System.Diagnostics.Debug.Assert desaparecem quando você cria uma versão de lançamento do código. Isso significa que a chamada que verifica o saldo desaparece na versão de lançamento. Para resolver esse problema, você deverá substituir System.Diagnostics.Debug.Assert por System.Diagnostics.Trace.Assert, que não desaparece na versão de lançamento:
As chamadas para System.Diagnostics.Trace.Assert adicionam sobrecarga para a versão de lançamento, ao contrário das chamadas para System.Diagnostics.Debug.Assert.
Efeitos colaterais de Debug.Assert
Quando você usar System.Diagnostics.Debug.Assert, verifique se algum código Assert
interno alterará os resultados do programa se Assert
for removido. Caso contrário, você poderá acidentalmente introduzir um bug que aparece somente na versão de lançamento do programa. Tenha cuidado especial sobre asserções que contêm chamadas de função ou procedimento, como o exemplo a seguir:
Este uso de System.Diagnostics.Debug.Assert talvez pareça seguro à primeira vista, mas suponhamos que a função meas atualize um contador sempre que for chamada. Quando você compila a versão de lançamento, essa chamada para meas é eliminada, de modo que o contador não será atualizado. Este é um exemplo de uma função com um efeito colateral. Eliminar uma chamada para uma função que tem efeitos colaterais pode resultar em um bug que aparece somente na versão de lançamento. Para evitar esses problemas, não coloque chamadas de função em uma instrução System.Diagnostics.Debug.Assert. Use uma variável temporária em vez disso:
Mesmo quando você usa System.Diagnostics.Trace.Assert, talvez ainda queira evitar colocar chamadas de função em uma instrução Assert
. Essas chamadas devem ser seguras, porque as instruções System.Diagnostics.Trace.Assert não são eliminadas em uma compilação de lançamento. No entanto, se você evitar construções por uma questão de hábito, será menos provável cometer um erro quando usar System.Diagnostics.Debug.Assert.
{1>Requisitos de rastreamento e depuração<1}
Se você criar o projeto usando assistentes do Visual Studio, o símbolo TRACE será definido por padrão nas configurações de Depuração e Versão. O símbolo DEBUG é definido por padrão apenas na compilação de depuração.
Caso contrário, para que os métodos Trace funcionem, o programa deverá ter um dos seguintes na parte superior do arquivo de origem:
#Const TRACE = True
no Visual Basic#define TRACE
no Visual C# e C++Ou o programa deverá ser compilado com a opção TRACE:
/d:TRACE=True
no Visual Basic/d:TRACE
no Visual C# e C++Se você precisar usar os métodos de depuração em uma compilação de lançamento do C# ou Visual Basic, deverá definir o símbolo DEBUG na configuração de lançamento.
A linguagem C++ não oferece suporte aos métodos da classe Debug. Você pode obter o mesmo efeito usando a classe Trace com compilação condicional, por exemplo,
#ifdef DEBUG
…#endif
. Você pode definir esses símbolos na caixa de diálogo <Projeto > Páginas de Propriedades. Para obter mais informações, confira Alterando as configurações de projeto para uma configuração de depuração do Visual Basic ou Alterando as configurações de projeto para uma configuração de depuração do C ou C++.
Declarar argumentos
System.Diagnostics.Trace.Assert e System.Diagnostics.Debug.Assert utilizam até três argumentos. O primeiro argumento, que é obrigatório, é a condição que você deseja verificar. Se você chamar System.Diagnostics.Trace.Assert(Boolean) ou System.Diagnostics.Debug.Assert(Boolean) com apenas um argumento, o método Assert
verificará a condição e, se o resultado for false, gerará o conteúdo da pilha de chamadas para a janela de Saída. O exemplo a seguir mostra System.Diagnostics.Trace.Assert(Boolean) e System.Diagnostics.Debug.Assert(Boolean):
O segundo e o terceiro argumentos, se houver, devem ser cadeias de caracteres. Se você chamar System.Diagnostics.Trace.Assert ou System.Diagnostics.Debug.Assert com dois ou três argumentos, o primeiro será uma condição. O método verifica a condição e, se o resultado for false, gera a segunda e a terceira cadeias de caracteres. O exemplo a seguir mostra System.Diagnostics.Debug.Assert(Boolean, String) e System.Diagnostics.Trace.Assert(Boolean, String) usados com dois argumentos:
Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );
O seguinte exemplo mostra System.Diagnostics.Debug.Assert(Boolean, String, String) e System.Diagnostics.Trace.Assert(Boolean, String, String) usados com três argumentos:
Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );
{1>Personalizar o comportamento de asserção<1}
Se você executar o aplicativo no modo de interface do usuário, o método Assert
exibe a caixa de diálogo Falha na Declaração quando a condição falhar. As ações que ocorrem quando uma asserção falha são controladas pela propriedade Listeners ou Listeners.
Você pode personalizar o comportamento de saída adicionando um objeto TraceListener à coleção de Listeners
, removendo TraceListener da coleção de Listeners
ou substituindo o método System.Diagnostics.TraceListener.Fail do TraceListener
existente para obrigá-lo a se comportar de maneira diferente.
Por exemplo, você pode substituir o método System.Diagnostics.TraceListener.Fail para gravar em um log de eventos em vez de exibir a caixa de diálogo Falha de Asserção.
Para personalizar a saída dessa forma, o programa deverá conter um ouvinte e você deverá herdar de TraceListener e substituir o método System.Diagnostics.TraceListener.Fail.
Para obter mais informações, confira Ouvintes de rastreamento.
Configurar asserções nos arquivos de configuração
Você pode definir asserções em seu arquivo de configuração do programa assim como em seu código. Para obter mais informações, consulte System.Diagnostics.Trace.Assert ou System.Diagnostics.Debug.Assert.